반응형

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")

}





+ Recent posts