ITS's Dev Story

오늘은 머신러닝 중 최적화 알고리즘, 로지스틱 회귀에 대해 탐구해 보기로 하였다. 가장 빠른 시간에 A에서 B로 가기 위해서는 가장 빨리 갈 수 있는 길을 컴퓨터가 찾아야 할 것이다. 이러한 것을 처리할 수 있는 가장 효과적인 방법이 바로 최적화 알고리즘이다.

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------

중학교 1학년 수학에서 처음으로 좌표평면을 이용한 함수를 배우게 되는데, 이도 이 알고리즘과 연관이 있다. 데이터가 표시된 좌표평면을 가로지르는 선을 최적선이라고 하고, 이 선을 그리는 것을 회귀라고 한다고 한다. 우선 나는 로지스틱 회귀 모델을 사용해서 기울기 상승 최적화 함수를 탐구해 보기로 하였다. 소스코드는 아래와 같다.

 

from numpy import *

def loadDataSet():
    dataMat = []; labelMat = []
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat

def sigmoid(inX):
    return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)             
    labelMat = mat(classLabels).transpose() 
    m,n = shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))
    for k in range(maxCycles):              
        h = sigmoid(dataMatrix*weights)     
        error = (labelMat - h)             
        weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
    return weights


이후 매스플롯라이브러리를 사용해서 직접 풀룻하는 코드이다. 소스코드는 아래와 같다.

 
def plotBestFit(weights):
    import matplotlib.pyplot as plt
    dataMat,labelMat=loadDataSet()
    dataArr = array(dataMat)
    n = shape(dataArr)[0] 
    xcord1 = []; ycord1 = []
    xcord2 = []; ycord2 = []
    for i in range(n):
        if int(labelMat[i])== 1:
            xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
        else:
            xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')
    x = arange(-3.0, 3.0, 0.1)
    y = (-weights[0]-weights[1]*x)/weights[2]
    ax.plot(x, y)
    plt.xlabel('X1'); plt.ylabel('X2');
    plt.show()


▲ Python Shell Code

▲ 플롯으로 출력한 모습

오늘은 여기까지 하기로 했다.


오늘은 나이브 베이스 확률이론을 사용해서 스팸메일 필터링 소프트웨어를 동작시키고 구현해 보았다.

먼저, 텍스트 토큰을 생성한다. 나는 아래와 같이 생성하였다.

그 다음, 이메일 데이터 집합 (예제 파일로 제공하는 샘플 데이터이다.)을 꺼낸다. 그 후, 파일 구문 분석 소스와 전체스팸 검사 함수를 Python으로 만들어 보았다. 

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------

소스코드는 아래와 같다.

def textParse(bigString):
    import re
    listOfTokens = re.split(r'\W*', bigString)
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] 
    
def spamTest():
    docList=[]; classList = []; fullText =[]
    for i in range(1,26):
        wordList = textParse(open('email/spam/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList = textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList = createVocabList(docList)
    trainingSet = range(50); testSet=[]          
    for i in range(10):
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])  
    trainMat=[]; trainClasses = []
    for docIndex in trainingSet:
        trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
    errorCount = 0
    for docIndex in testSet:      
        wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
        if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
            errorCount += 1
            print "classification error",docList[docIndex]
    print 'the error rate is: ',float(errorCount)/len(testSet)


맨 마지막 실행 화면은 사진으로 못 찍었지만 글로 써 본다.

>>> bayes.spamTest()

the error rate is : 0.0

초등학교 5학년 때 서울교대 영재원을 다니면서 오바마와 박근혜 대통령의 연설문 데이터에서 가장 많이 쓰인 단어를 추출해내는 프로그램을 교수님이 만들어 보라고 하신 적이 있다. 단순히 기술만 생각한다면 이 수업은 별 효과가 없을 것이라고 생각한다. 아마도 머신러닝도 그럴 것이다.

오늘은 여기까지 하기로 했다.

오늘은 머신러닝 알고리즘인 나이브 베이스 확률이론에 대해 공부해 보기로 하였다. 이 방식은 데이터가 각 분류에 속할 확률을 구하고, 이중 가장 높은 확률을 가지는 분류를 선택하는 것이다. 나는 오늘 이 알고리즘을 사용해서 문서를 분류하는 알고리즘을 만들어 보았다.

먼저, 실험을 위해 몇개의 예제 데이터를 생성한다. 그리고 모든 문서에 있는 모든 유일한 단어 목록을 생성한다. 마지막으로 어휘 목록을 만든 다음 단어가 존재하는지 아닌지를 구별하는 함수를 사용할 것이다.

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------

내가 만들어 본 소스 코드는 아래와 같다.

from numpy import *

def loadDataSet():
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]
    return postingList,classVec
                 
def createVocabList(dataSet):
    vocabSet = set([])
    for document in dataSet:
        vocabSet = vocabSet | set(document)
    return list(vocabSet)

def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

직접 확인해 보기 위해 아래와 같이 실습을 해 본다.

오늘은 여기까지 하기로 했다.

내가 만든 소스코드를 실험해 보기 위해 TreePlotter 모듈을 만들어 컴파일했는데 이렇게 에러가 났다.

ImportError : No moudle named matplotlib

에러 : matplotlib 모듈이 없습니다!!!

왜 이런 에러가 날까? 내가 짠 TreePlotter 모듈의 소스코드를 일부부분만 공개한다.

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------


import matplotlib.pyplot as plt

decisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")

def getNumLeafs(myTree):
    numLeafs = 0
    firstStr = myTree.keys()[0]
    secondDict = myTree[firstStr]
... (이하 생략)

이 부분에 matplotlib을 import해주는 부분이 있어서이다. 그렇다면 그 라이브러리를 설치해야 한다.

우선 공식 홈페이지에 가서, 64비트 기반 Installer를 다운로드 받았다.


근데... 파이썬 경로를 못 잡는다. 어쩔 수 없다. whl 파일로 설치해보는 걸로 한다. 근데 이번에는 pip이 없다. whl파일을 설치하려면 pip이 필요하다. 공식 홈페이지에 있는 get-pip.py 파일로 설치해보는걸로 한다.

이제 내가 구한 파일을 실행한다.

이게 무슨 일인고?

어? 어? 어어어? 제대로 된 파일이름이 아니란다. 알아보니 중간에 수정하면 설치가 안된다고 한다.

다시 파일을 다운받아서 설치한다.

어? 되는 것 같은데?

이번에도 설치가 안된다.

그래서 구글에 에러 내용을 똑같이 쳤다. Could not find a version that satisfies the requirement mathplotlib...

검색해보니 한 스택오버플로우 게시글이 나온다. 여기서는 미러 서버를 이용한 해결방법을 제시하고 있다.

그대로 실행해 본다.

Sucessfully installed!

그럼 지금까지 한게 헛수고란 말인가? (커맨드로 수동 설치할 경우 잘못 설치하면 그 과정이 헛수고가 되는 경우가 많음)

matplotlib import도 잘 된다.

에러가 나던 treePlotter 모듈 import도 잘 된다!

이제 의사결정 트리를 직접 동작해 본다.

제대로 동작하는 모습을 볼 수 있다. 이를 해결하기 위해 1시간 정도가 소요되었다. 1시간 동안 헛수고를 하면서 수동설치기의 근본적인 문제를 찾아내고 이를 해결해 나가는 시간이 꼭 헛수고만은 아닐 것이라 생각한다. 오늘은 여기까지 하기로 했다.

오늘은 트리를 직접 만들어 보는 실습을 하기로 했다. 트리는 의사결정 기술이라고 해서 분류 기술 중 가장 일반적으로 사용되는 기술이라고 한다. 의사결정 트리의 기초가 되는것은 바로 프로그래밍을 하게 되면 종종 보게 되는 플로우차트(flowchart)이다. 얼마 전 내가 토론대회에서 논제결과를 발표했을 때 반론으로 "플로우차트가 비전문가들이 알아보기 힘드니 풀어서 설명해라"라고 나왔는데, Flowchart는 소스코드를 디자인화시킨 것이지 비전문가들에게 완벽하게 코드를 이해시키기 위한 그림이 아니다. 혹시나 헷갈리는 일이 없었으면 한다.

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------


(출처 : Wikipedia, 문제가 될 경우 다른 사진으로 대체)

플로우차트가 왜 머신러닝에서 언급되냐 하면 데이터 집합을 구분하기 위해 필요하기 때문이다. 의사결정 트리, 즉 플로우차트를 만들기 위해서는 하나의 최초 의사결정을 만들어야 한다. 의사결정의 구조는 다음과 같다.

최초 의사결정은 데이터를 분할하는데 영향을 주는 속성으로 결정되게 되고, 이러한 결정은 모든 속성에 대해 측정을 하면서 얻어지며, 결정된 속성으로 분할하는 경우 가장 좋은 결과를 얻게 되는 것이다. 

그런 다음 데이터 집합을 하위 집합으로 분할한다. 하위 집합은 최초 의사결정의 가지로 모이게 된다. 가지에 있는 데이터가 모두 같은 분류에 속하면 계속 반복하지 않아도 되지만, 만약 그렇지 않다면 그 과정을 다시 반복해야 할 것이다.

이렇게 생기는 데이터 집합을 분할하기 전과 후의 변화를 정보 이득이라고 하며, 데이터 집합에 대한 정보 측정 방법을 섀넌 엔트로피, 줄여서 엔트로피라고 한다. 아마도 정보 이득과 엔트로피라는 용어가 혼란스럽게 들릴 수도 있다. 하지만 이 단어들이 혼란스러운 것은 당연한 이야기이다. 이에 대한 답은 이 글을 읽는 독자들이 알아서 찾아 나가기를 바란다.

우선, 나는 데이터 집합의 엔트로피를 계산하는 함수를 만들어 보기로 하였다. 예제에 나온 소스코드는 다음과 같다.

def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob,2) #log base 2
    return shannonEnt

그 다음 집합을 분할하는 함수를 만들어 보았다. 소스코드는 아래와 같다.

def splitDataSet(dataSet, axis, value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet
그 다음 데이터 분할 시 가장 좋은 속성을 선택하는 함수를 만들었다. 소스코드는 아래와 같다.
def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1  
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0; bestFeature = -1
    for i in range(numFeatures):       
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)   
        newEntropy = 0.0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)     
        infoGain = baseEntropy - newEntropy  
        if (infoGain > bestInfoGain):     
            bestInfoGain = infoGain     
            bestFeature = i
    return bestFeature         
그 다음, 트리 만들기 함수를 만들었다. 소스코드는 아래와 같다.
def createTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]
    if classList.count(classList[0]) == len(classList): 
        return classList[0]
    if len(dataSet[0]) == 1:
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureToSplit(dataSet)
    bestFeatLabel = labels[bestFeat]
    myTree = {bestFeatLabel:{}}
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
    return myTree 

최근 Github에 내가 만든 머신러닝 소스코드를 올려 공유하고 있다. 주소는 아래와 같다.

https://github.com/itsss/machinelearning


오늘은 여기까지 하기로 하고, 내일 실제로 동작해보는 것으로 했다.

이번에는 k-최근접 이웃 알고리즘을 Python으로 시연해 보기로 하였다. k-최근접 이웃 알고리즘의 장점은 높은 정확도와 데이터에 대한 가정이 없다는 것이고, 단점은 계산 비용이 높고 많은 리소스를 요구한다는 것이다. 흔히 매우 간단한 기계학습 알고리즘에 속한다고 한다. 

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------

훈련 데이터는 각각이 항목 분류명을 갖는 다차원 특징 공간에서의 벡터이다. 알고리즘의 훈련 단계는 오직 훈련 표본의 특징 벡터와 항목 분류명을 저장하는 것이다. 분류 단계에서 k는 사용자 정의 상수이고 분류명이 붙지 않은 벡터(질의 또는 검증점)는 k개의 훈련 표본 사이에서 가장 빈번한 분류명을 할당함으로써 분류된다. 연속 변수에서 가장 흔하게 사용되는 거리 척도는 유클리드 거리이다. 문자 분류와 같은 이산 변수의 경우 중첩 거리(또는 해밍 거리)와 같은 다른 척도가 사용될 수 있다. 예를 들어 유전자 표현 미세 배열 데이터의 경우, k-NN은 피어슨과 스피어만 같은 상관 계수를 사용해 왔다.종종 거리 척도가 큰 여백 최근접 이웃이나 이웃 성분 분석과 같은 특별한 알고리즘으로 학습된다면 k-NN의 분류의 정확성을 상당히 향상시킬 수 있다. (위키피디아 인용)

우선, kNN을 이용한 여러 프로젝트들을 구현하기 위해 파이썬 파일을 생성하고, 소스 코드를 추가할 것이다. 내가 추가한 kNN의 모듈의 소스코드는 아래와 같다. 

from numpy import *
import operator
from os import listdir

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()     
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels

def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())
    returnMat = zeros((numberOfLines,3))
    classLabelVector = []  
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index += 1
    return returnMat,classLabelVector
    
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m,1))
    normDataSet = normDataSet/tile(ranges, (m,1)) 
    return normDataSet, ranges, minVals
   
def datingClassTest():
    hoRatio = 0.50      #hold out 10%
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
        if (classifierResult != datingLabels[i]): errorCount += 1.0
    print "the total error rate is: %f" % (errorCount/float(numTestVecs))
    print errorCount
    
def img2vector(filename):
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0,32*i+j] = int(lineStr[j])
    return returnVect

def handwritingClassTest():
    hwLabels = []
    trainingFileList = listdir('trainingDigits')
    m = len(trainingFileList)
    trainingMat = zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)
        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)
    testFileList = listdir('testDigits')
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)
        if (classifierResult != classNumStr): errorCount += 1.0
    print "\nthe total number of errors is: %d" % errorCount
    print "\nthe total error rate is: %f" % (errorCount/float(mTest))



-----------------------------------------------------------------------

나는 이 중, 내가 옛날에 C#으로 개발했었던 Handwriting 알고리즘을 개발하고 싶었다. 이를 kNN을 활용해서 테스트를 해 보았다. 이미지 파일은 아래와 같다.


바이너리 이미지를 쉽게 다루도록 하기 위해 텍스트로 변환하였다.

이를 실제로 돌려 보면 아래와 같이 된다.

이 소스에서는 2000여개 Data 중 11개 오차가 발생했다. (1.2% 오류율)

이 실험을 해 보면서 kNN 알고리즘은 간단하며 데이터를 분류하는 데 효과적인 알고리즘이고, 데이터 구조에 대한 어떠한 정보도 알 수 없다는 것이 가장 큰 단점이라는 결론을 내리게 되었다. 오늘은 여기까지 하기로 하였다. 다음에는 kNN을 이용한 다른 시험도 해 보도록 해야 겠다.

이번에는 중학교 1학년 수학에 나오는 약수를 구하는 방법을 C언어로 만들어 보았다.

소스 코드는 아래와 같다.

#include <stdio.h>

int main() 

{

 int i, number;

 printf("Input number");

 scanf("%d", &number);

 for(i=1; i<=number; i++)

 {

  if(number%i==0)

  {

  printf("%d ", i);

  }

 }

 printf("\n");

}

이 소스코드는 자연수를 입력하면 for문으로 반복하여 숫자와 for문 카운트의 나머지가 0이 나오면 숫자를 출력하도록 만든 소스 코드이다. 이를 계속 반복하여 약수를 구하도록 만들었다.

그리고, Github에 내가 만든 소스코드를 업로드하였다. 방법은 아래와 같다.

먼저, Git을 설치한다. https://git-scm.com/download/win에서 Windows Git을 다운받는다.

다 설치한 후 Git Bash를 실행 > 사용자 이름과 메일 주소를 설정한다. 설정 Command는 아래와 같다.

$ git config --global user.name "이름"

$ git config --global user.email "이메일"


커맨드를 입력한 후 다양한 명령어 출력을 읽기 쉽게 하기 위해 아래 명령어를 친다.

$git config --global color.ui auto


그 다음, ssh key를 생성해 Github에 등록해야 한다. 이를 위해

$ssh-keygen -t rsa -C "이메일" 을 친다. 정상적으로 과정이 완료되면

id_rsa.pub라는 공개 키가 생성된다. 이를 메모장으로 열고 전부 복사해서 Github 환경설정 > SSH Keys 부분에 붙여넣기 한다. 이후 실제로 동작하는지 확인하기 위해 $ssh -T git@github.com을 입력한다.

정상적으로 처리가 되었다면, Hi itsss! You've successfully... 라는 메시지가 출력될 것이다.

이후 Github에서 리포지토리 작성을 해야 하는데 이름은 아무거나 해도 된다. 이미 있다면 그냥 그걸로 해도 된다. 우선 Code를 작성한 후 그 코드를 사용자 디렉토리 (windows를 기준으로 현재 로그인된 사용자이름이 itsc인 경우 시작-ITSC로 가면 나오는 디렉토리)에 붙여 넣는다.


이후 이 명령어를 순차적으로 입력한다. (자신의 리포지토리에 들어가서 Code 내용을 보는게 더 정확함)

echo # 리포지토리 이름 >> 파일 이름

git init

git add 파일 이름

git commit -m "커밋 내용"

git remote add origin https://github.com/사용자 이름/리포지토리 이름.git

git push -u origin master

명령어를 다 입력하면 Github의 ID와 PW를 알려 달라고 한다. 알려 준 후 Github에 가서 확인해 보면 자신의 소스 코드가 올라간 것을 볼 수 있다.


오늘은 여기까지 하기로 했다.



최근 머신러닝을 위한 프로젝트를 준비하고 있다. 이를 위해 Coursera에서 MOOC를 수강하며 R 프로그래밍 등의 머신러닝 스킬들을 익힐 수 있었다. 하지만 이로만은 충분치 않아 머신러닝 책을 사서 책에 나오는 내용들을 공부하면서 이를 블로그에 꾸준히 게재하려고 한다.

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------

언어는 수학 라이브러리들을 더 쉽게 연결하고, 인기가 많으면서 오픈소스이며, 내 프로젝트를 쉽게 공유하기 위해 Python이라는 언어를 선택했다.

* Python이란? 파이썬(Python)은 1991년 프로그래머인 귀도 반 로섬(Guido van Rossum)이 발표한 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다. (위키피디아 인용)

우선 기계학습을 하기 위해 필요한 라이브러리인 numpy를 다운받아야 한다. 지금 내가 글을 쓰고 있는 시점에서는 numpy for python 3.5버전이 아직 출시되지 않았다. 그래서 파이썬 2.7버전을 다운받기로 하였다. 이후 numpy를 다운받기 위해 Sourceforge에 들어간다.

다운로드 링크는 이와 같다. (http://sourceforge.net/projects/numpy/files/NumPy/1.10.2/)

설치 후에는 아래와 같이 from numpy import * 를 파이썬 커맨드에 쳐 제대로 설치가 되었는지 확인한다.

이후 위 사진과 같이 numpy 함수가 제대로 작동하는지 테스트 해 보았다. 일단 여기까지 하고 이따가 더 올리기로 하겠다.