R로 만들어본 linear regression
입력 x 1개에 대해 출력 y 1개를 만드는 추정 모델.
대략 y=2x+1 에 해당되는 학습데이터들이 있을 때 이를 학습해 보고, 테스트 데이터로 추정해 본다.
아래 그래프에서 검은 o은 학습 데이터, 빨간 o는 테스트 데이터로 추정해본 결과이다. 대략 비슷하게 잘 추정하였다.
(X) -W-> (Y)
샘플 데이터는
input X Y
x1 | x2 | y |
1 |
1 | 2 |
1 |
2 | 6 |
1 |
4 | 10 |
1 |
6 | 11 |
X의 첫번째 컬럼에 1을 모두 준 것은 Matrix 연산시에 bias를 한 번에 계산하기 위해 x1를 1로 두었다. 이렇게 되면 w1을 bias로 볼 수 있다.
y값이 대략 x의 2배 조금 큰 정도이다.
원래 input인 X의 크기는 아래와 같다.
X = (4, 1) shape
Y = (4, 1) shape
W = (1, 1) shape
b = (1,1) shape
여기서 b를 따로 계산하기 싫다면 아래와 같이 변경할 수 있다.
X = (4, 2) shape (1열에 모두 1을 추가. for bias)
Y = (4, 1) shape
W = (2, 1) shape ( W1이 bias 역할을 수행한다.)
b는 이제 생각할 필요없이 자동으로 계산된다.
* linear 모델 디자인
H(x) = w*x+b
b는 필요없고, matrix를 맞추면.
Hypothesis(Y~) = X * W ; 4x2 * 2x1 = 4x1
* cost function
m = training set 개수; 4개
Cost = (1/m) * Sigma ( (Y~-Y)^2 )
* learning
W:=W-alpha*Cost'
Cost 미분 = d Cost / d W
Cost' = 1/(2m) * Sigma ( (Y~-Y)*x )
alpha가 상수이기 때문에 2m이나 m이나 상관없다.
W = W-alpha * 1/m * Sigma ( (Y~-Y)*x )
Sigma( (Y~-Y)*x ) 이 부분을 풀면
예측값(Y~)은 H(X,W)이고, Y(실측값)을 빼고, X를 곱한다.
shape은 왼쪽이 Y형태이니 (4,1), X는 (4,2)인데, matrix 곱을 해야 한다.
Y의 행과 X의 행은 훈련데이터 레코드를 구분하는 것이다. Y의 가로와 X의 가로가 곱해야 한다. 즉, 어느 한 쪽을 transpose해 주어야 함.
결과가 W의 shape모양이 나와야 한다. (2,1)
따라서
(2,4)*(4,1) = (2,1) 을 만들 수 있다.
W = W-alpha * 1/m * t(X) %*% (H(X,W)-Y) )
#
# deep learning test
#
# linear regression ; test.. y=2x+1 near learning
#
PLOTSHOW=TRUE
# training , X1=1 (bias)
X=matrix( c(1,1,1,1 ,
1,2,4,6), ncol=2 )
# training result Y
Y=matrix( c(2,6,10, 11) )
# searching parameter, w1=bias
W=c(2,2)
# drawing
if ( PLOTSHOW ) {
plot(1:20,1:20,type="n")
points(X[,2], Y)
}
# H(X,W)=w1+ w2*x2
H = function (X, W) {
H = X %*% W
return (H)
}
Cost =function (X, W, Y) {
m = nrow(X)
return (sum((H(X,W)-Y)^2) / m)
}
Gradient = function (X, W, Y, alpha) {
m = nrow(X)
W = W - alpha/m * ( t(X) %*% (H(X,W)-Y) )
return (W)
}
print( Cost(X, W, Y) )
#learning
alpha=0.1
for ( i in 1 : 500 ) {
W = Gradient(X,W,Y,alpha)
if ( i %% 50==0 ) {
print(paste("cnt=", i, " Cost=", Cost(X,W,Y), " W1(b)=", W[1,1], " W2=", W[2,1]) )
}
}
# predict
qx = c(3,5)
xmat = cbind( rep(1, length(qx)), qx)
qy = H( xmat, W )
print (qx)
print (qy)
# drawing
if ( PLOTSHOW ) {
abline(W[1,1], W[2,1]) # y axis bias, slope
points(qx, qy, col="red")
}
'AI(DeepLearning)' 카테고리의 다른 글
[tf] XOR manual solve (0) | 2017.05.23 |
---|---|
[R] multinomial classification. 다중분류 (0) | 2017.05.19 |
[R] binary classification (0) | 2017.05.19 |
[R] linear regression Normal Equation (0) | 2017.05.19 |
[R] linear regression (multi variable) 더하기 학습 (0) | 2017.05.11 |