AI(DeepLearning)

[R] linear regression (multi variable) 더하기 학습

크레이지제이 2017. 5. 11. 20:28
반응형


더하기를 학습시키는 Model을 만들어보자.

구현은 R을 사용하여 간략히 작성.

전에 것과 큰 차이는 없고, x의 feature가 하나 늘어났음.


(X) -W-> (Y)


샘플 데이터는 

input X     Y

 x1 x2  x3 y

 1

 1 

 1

 2

 1

 2

 5

 1

 4

 2 6

 1

 2

 4

 1 3 3 6
 1 3

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


완료