Machine Learning in Action ch.8.1 & 8.2 Regression

8.1 회귀로 최적선 찾기

우리가 회귀를 사용하는 이유는 수치형 목적 값을 예측하기 위해서이다. 그 방법은 입력에 대한 목적 값의 방벙식을 세우는 것이다.

예를 들면, 행복 = 돈 * 0.4 + 지혜 * 0.8

이것이 곧 회귀 방정식이다. 여기서 0.4 와 0.8은 가중치라고 한다. 즉, 예측이란 회귀 가중치로 입력된 값을 곱하고 , 곱한 값을 모두 더하여 얻어진다.

위와 같은 회귀를 선형 회귀라고 한다.

다른 회귀 유형도 있다. 비선형 회귀는 출력을 위해 입력 된 모든 값을 곱하는 기능을 가지고 있다.

예를 들면, 행복 = 0.002 * 돈/ 지혜

이것이 비선형 회귀에 대한 예제이다.


데이터로부터 어떻게 회귀 방정식을 구할 수 있을까?
입력 데이터는 행렬 X에 있고, 벡터 w에는 회귀 가중치가 담겨있다.

예측 값은 y1 = X1^T * w 로 구하게 된다.
w를 찾는 방법은 오류를 최소하하는 것이다.
여기서 제곱 오류를 사용한다.

수학적인 표현이 많아 스킵한다.


실습 예제를 해보면



위와 같이 코드를 작성해 보면 아래와 같은 선형 회귀를 플롯할 수 있다.


8.2 지역적 가중치가 부여된 선형 회귀 

선형 회귀의 한 가지 문제점은 데이터에 대한 부족적합 경향을 보인다는 것이다.
그래서 여기에 추정 값에 성향을 추가하여 평균 제곱 오류를 줄일 수 있는 방법을 다룬다.

평귭 제곱을 오류를 줄이는 방법 중 지역적 가중치가 부여된 선형 회귀 또는 줄여서 LWLR이라는 방법이 있다.

이것은 관심이 있는 데이터 점 근처에 있는 다른 데이터 점들에 가중치를 부여한다. 약간 kNN과 비슷한 느낌이다.


(출처 : http://javacan.tistory.com/entry/MachineLearningInAction-08-Regression)

가우스 확률 분포 같은 수학적 계산은 넘어가고 LWLR 함수를 보면 아래와 같다.

def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    weights = mat(eye((m)))
    for j in range(m):                      #next 2 lines create weights matrix
        diffMat = testPoint - xMat[j,:]     #
        weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
    xTx = xMat.T * (weights * xMat)
    if linalg.det(xTx) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T * (weights * yMat))
    return testPoint * ws

def lwlrTest(testArr,xArr,yArr,k=1.0):  #loops over all the data points and applies lwlr to each one
    m = shape(testArr)[0]
    yHat = zeros(m)
    for i in range(m):
        yHat[i] = lwlr(testArr[i],xArr,yArr,k)
    return yHat


(출처 : http://javacan.tistory.com/entry/MachineLearningInAction-08-Regression)








댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리