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)
댓글
댓글 쓰기