[R] linear regression (multi variable) 더하기 학습
더하기를 학습시키는 Model을 만들어보자.
구현은 R을 사용하여 간략히 작성.
전에 것과 큰 차이는 없고, x의 feature가 하나 늘어났음.
(X) -W-> (Y)
샘플 데이터는
input X Y
x1 | x2 | x3 | y |
1 | 1 | 1 | 2 |
1 | 2 | 3 | 5 |
1 | 4 | 2 | 6 |
1 | 2 | 2 | 4 |
1 | 3 | 3 | 6 |
1 | 3 | 2 | 5 |
1 | 4 | 4 | 8 |
1 | 5 | 1 | 6 |
1 | 1 | 3 | 4 |
1 | 1 | 4 | 5 |
X의 첫번째 컬럼에 1을 모두 준 것은 Matrix 연산시에 bias를 한 번에 계산하기 위해 x1를 1로 두었다. 이렇게 되면 w1을 bias로 볼 수 있다.
y값은 x2+x3이다. 더하기를 학습시키기로 한다.
X = (10, 3) shape (1열에 모두 1을 추가. for bias)
Y = (10, 1) shape
W = (3, 1) shape ( W1이 bias 역할을 수행한다.)
훈련데이터 하나로 봤을 때, 입력이 3개(그중 하나는 bias를 위해 무조건 1로 고정)이고 출력은 1개 이다.
* linear 모델 디자인
H(x) = w*x+b
b는 필요없고, matrix를 맞추면.
Hypothesis(Y~) = X * W ; 10x3 * 3x1 = 10x1
* cost function
m = training set 개수; 10개
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형태이니 (10,1), X는 (10,3)인데, matrix 곱을 해야 한다.
Y의 행과 X의 행은 훈련데이터 레코드를 구분하는 것이다. Y의 가로와 X의 가로가 곱해야 한다. 즉, 어느 한 쪽을 transpose해 주어야 함.
결과가 W의 shape모양이 나와야 한다. (3,1)
따라서
(3,10)*(10,1) = (3,1) 을 만들 수 있다.
W = W-alpha * 1/m * t(X) %*% (H(X,W)-Y) )
#
# deep learning test
#
# linear regression, multi vars. ADD learning.... y = x2+x3
#
# training , X1=1 (bias)
X=matrix( c(1,1,1, 1,2,3, 1,4,2, 1,2,2, 1,3,3, 1,3,2, 1,4,4, 1,5,1, 1,1,3, 1,1,4), byrow = T, ncol=3 )
# training result Y
Y=matrix( c(2, 5, 6, 4, 6, 5, 8, 6, 4, 5) )
# searching parameter, w1=bias
#W=c(0, 0, 0)
W=rnorm(3)
# 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 : 1000 ) {
W = Gradient(X,W,Y,alpha)
if ( i %% 100==0 ) {
print(paste("cnt=", i, " Cost=", Cost(X,W,Y), " W1(b)=", W[1,1], " W2=", W[2,1], " W3=", W[3,1] ))
}
}
# predict
xmat = matrix( c(1,1,1, 1,2,4, 1,4,1, 1,2,2, 1,6,8, 1,30,45), byrow = T, ncol=3 )
qy = H( xmat, W )
print (xmat)
print (qy)
======================
[결과]
[1] 17.21935 => 처음에 에러가 높음
[1] "cnt= 100 Cost= 0.00734778231698152 W1(b)= 0.311519194482933 W2= 0.955780333009714 W3= 0.930195352334659" => Cost가 감소함
[1] "cnt= 200 Cost= 0.00177641680389291 W1(b)= 0.153171902333706 W2= 0.978257487961482 W3= 0.965677519676141"
[1] "cnt= 300 Cost= 0.000429470624607385 W1(b)= 0.0753135990106769 W2= 0.989309352379876 W3= 0.983123866187081"
[1] "cnt= 400 Cost= 0.000103829808970766 W1(b)= 0.0370311924675553 W2= 0.99474348013076 W3= 0.991702117976784"
[1] "cnt= 500 Cost= 2.51021341465692e-05 W1(b)= 0.0182079894412524 W2= 0.997415404368608 W3= 0.995919986957054"
[1] "cnt= 600 Cost= 6.06874986055061e-06 W1(b)= 0.00895274651992987 W2= 0.998729171629903 W3= 0.997993884899299"
[1] "cnt= 700 Cost= 1.46719496656704e-06 W1(b)= 0.0044020055321717 W2= 0.999375142197631 W3= 0.999013606634366"
[1] "cnt= 800 Cost= 3.54712439857382e-07 W1(b)= 0.00216443665216407 W2= 0.999692761601513 W3= 0.999514996985255"
[1] "cnt= 900 Cost= 8.57560977625059e-08 W1(b)= 0.00106423901264822 W2= 0.999848932936186 W3= 0.999761527264368"
[1] "cnt= 1000 Cost= 2.07325920297307e-08 W1(b)= 0.000523279198266241 W2= 0.999925721335999 W3= 0.999882744552279" => Cost가 거의 0이되었음. 학습 잘 됨.
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 2 4
[3,] 1 4 1
[4,] 1 2 2
[5,] 1 6 8
[6,] 1 30 45
[,1]
[1,] 2.000332 ; 1+1
[2,] 5.999906 ; 2+4
[3,] 5.000109 ; 4+1
[4,] 4.000140 ; 2+2
[5,] 13.999140 ; 6+8
[6,] 74.993018 ; 30+45