반응형

binary classification은 두 개로 분류하는 것이다.

이 binary classification을 하는 것을 여러개 붙이면 다중 분류도 가능하다.

즉,  isAclass() 로 A이냐 아니냐 판단,   isBclass()로 B이냐 아니냐 판단. isCclass()로 C이냐 아니냐 하는 판단 모듈들이 있으면, 조합하면 A, or B or C로 분류할 수 있다.


(x1, x2)의 특성을 같는 데이터 X를 세 가지(A,B,C)로 분류한 학습 데이터가 있다고 하자.   새로운 X가 올 경우 학습모델을 갖고 분류를 추정할 수 있다.

아래 그림에서 검은색은 훈련데이터로 이미 A, B, C 분류 결과도 있다. 이를 기반으로 학습을하여  다중 분류 모델을 만들고, 실습데이터(빨간색)로 분류하여 표시한 그래프이다.  

원하는대로 적절하게 잘 분류하였다.


훈련 데이터는 (x1,x2) 좌표와 클래스 구분결과를 one hot인코딩한 데이터이다.



아래는 sigmoid만 사용한 방식.

# deep learning test

# Multinomial Classification... Softmax

#         choose learning.... A,B,C

# A=left side, B=bottom side, C=right,up side


PLOTSHOW=TRUE


# training , X1=1 (bias)

X=rbind(  c(1,1,1), c(1,1,5), c(1,2,6), c(1,2,3), c(1,4,6), 

          c(1,2,1), c(1,3,2), c(1,4,2), c(1,6,3), c(1,8,1), 

          c(1,1,10), c(1,4,8), c(1,6,6), c(1,7,5), c(1,9,3) )


# training result Y

Y=rbind ( c(1,0,0), c(1,0,0), c(1,0,0), c(1,0,0), c(1,0,0),

          c(0,1,0), c(0,1,0), c(0,1,0), c(0,1,0), c(0,1,0),

          c(0,0,1), c(0,0,1), c(0,0,1), c(0,0,1), c(0,0,1))


# searching parameter, A's W column, B's, C's

W=cbind( c(1,2,3), c(2,3,2), c(3,4,1) )


# drawing 

if ( PLOTSHOW ) {

  plot(1:10,1:10,type="n")

  pchs = vector(length = nrow(X))

  pchs[which(Y[,1]==1)]="A"

  pchs[which(Y[,2]==1)]="B"

  pchs[which(Y[,3]==1)]="C"

  points(X[,2], X[,3], pch=pchs)

}



# most high probablity select

Onehot = function(T) {

  OH=matrix(0, nrow=nrow(T), ncol=ncol(T))

  ohw=apply(T,1,function(x) return(which.max(x)))

  for (i in seq(ohw))

    OH[i,ohw[i]]=1

  return (OH)

}


# logistic function: sigmoid

# G(X,W)=1/(1+e^-z)   , z=WX

G = function (X, W) {

  Z=X %*% W

  G = 1/(1+exp(-Z))

  return (G)

}


Cost =function (X, W, Y) {

  m = nrow(X)

  return ( (-1)/m * sum(Y*log(G(X,W)) + (1-Y)*log(1-G(X,W))) )

}



Gradient = function (X, W, Y, alpha) {

  m = nrow(X)

  W = W + alpha/m * ( t(X) %*% (((Y-1)*exp(X%*%W)+Y) / (exp(X%*%W)+1)) ) 

  return (W)

}


print( Cost(X, W, Y) )


#learning

alpha=0.1

for ( i in 1 : 600 ) {

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

  }

}


# test

# classify

xmat = matrix( c(1,1,1, 1,2,4, 1,4,1, 1,9,2, 1,6,8, 1,3,4,

                 1,8,8, 1,6,6, 1,2,8, 1,9,5), byrow = T, ncol=3 ) 

qy = G( xmat, W )

print (xmat)

print (qy)

qy2=Onehot(qy)

print(qy2)



# drawing 

if ( PLOTSHOW ) {

  pchs = vector(length = nrow(xmat))

  pchs[which(qy2[,1]==1)]="A"

  pchs[which(qy2[,2]==1)]="B"

  pchs[which(qy2[,3]==1)]="C"

  points(xmat[,2], xmat[,3], pch=pchs, col="red")

}

#dev.off()



아래는 softmax의 확률 함수와 cost를 계산하는 함수는 다음과 같다.

# softmax ; make probablity ; S(yi)=e^yi / Sigma(e^yi)

# cross entropy cost function

# D(S,L) = Sigma Li.* -log(y^)


softmax와 cross entropy로 학습한 방식

# deep learning test
# Multinomial Classification... Softmax
#         choose learning.... A,B,C
# A=left side, B=bottom side, C=right,up side

PLOTSHOW=TRUE

# training , X1=1 (bias)
X=rbind(  c(1,1,1), c(1,1,5), c(1,2,6), c(1,2,3), c(1,4,6), 
          c(1,2,1), c(1,3,2), c(1,4,2), c(1,6,3), c(1,8,1), 
          c(1,1,10), c(1,4,8), c(1,6,6), c(1,7,5), c(1,9,3) )

# training result Y
Y=rbind ( c(1,0,0), c(1,0,0), c(1,0,0), c(1,0,0), c(1,0,0),
          c(0,1,0), c(0,1,0), c(0,1,0), c(0,1,0), c(0,1,0),
          c(0,0,1), c(0,0,1), c(0,0,1), c(0,0,1), c(0,0,1))

# searching parameter, A's W column, B's, C's
W=cbind( c(1,2,3), c(2,3,2), c(3,4,1) )

# drawing 
if ( PLOTSHOW ) {
  plot(1:10,1:10,type="n")
  pchs = vector(length = nrow(X))
  pchs[which(Y[,1]==1)]="A"
  pchs[which(Y[,2]==1)]="B"
  pchs[which(Y[,3]==1)]="C"
  points(X[,2], X[,3], pch=pchs)
}


# softmax ; make probablity ; S(yi)=e^yi / Sigma(e^yi)
# yi = xw
Softmax = function(X, W) {
  T=exp(X%*%W)
  sume=apply(T, 1, sum)
  return (T/sume)
}

# most high probablity select
Onehot = function(T) {
  OH=matrix(0, nrow=nrow(T), ncol=ncol(T))
  ohw=apply(T,1,function(x) return(which.max(x)))
  for (i in seq(ohw))
    OH[i,ohw[i]]=1
  return (OH)
}

# cross entropy cost function
Cost =function (X, W, Y) {
  # D(S,L) = Sigma Li.* -log(y^)
  m = nrow(X)
  return ( (-1)/m * sum(Y*log(Softmax(X,W)) ) )
}


Gradient = function (X, W, Y, alpha) {
  m = nrow(X)
  W = W - alpha/m * ( t(X) %*% (Softmax(X,W)-Y) )
  return (W)
}

print( Cost(X, W, Y) )

#learning
alpha=0.1
for ( i in 1 : 2000 ) {
  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] ))
  }
}

# test
# classify
xmat = matrix( c(1,1,1, 1,2,4, 1,4,1, 1,9,2, 1,6,8, 1,3,4,
                 1,8,8, 1,6,6, 1,2,8, 1,9,5), byrow = T, ncol=3 ) 
qy = Softmax( xmat, W )
print (xmat)
print (qy)
qy2=Onehot(qy)
print(qy2)


# drawing 
if ( PLOTSHOW ) {
  pchs = vector(length = nrow(xmat))
  pchs[which(qy2[,1]==1)]="A"
  pchs[which(qy2[,2]==1)]="B"
  pchs[which(qy2[,3]==1)]="C"
  points(xmat[,2], xmat[,3], pch=pchs, col="red")
}
#dev.off()



'AI(DeepLearning)' 카테고리의 다른 글

[tf] XOR tensorflow로 학습구현  (0) 2017.05.23
[tf] XOR manual solve  (0) 2017.05.23
[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
반응형

바이너리 분류 문제를 풀어보자.

logistic regression을 하면 된다.

linear regression은 출력이 실수범위로 주어진 샘플들을 거의 만족하는 수식을 찾아내는 거고, 그 수식을 기반으로 새로운 임의의 입력에 대해서 출력을 하여 그 값이  추측값이다.

logistic regression은 분류의 문제로 출력은 0 또는 1이다. 따라서 출력 범위가 실수 전체가 아니라 0/1 바이너리이다. 

이를 위해서 모델의 방식이 logistic function을 사용하게 된다. 0~1범위의 출력값을 갖는 함수를 이용하여 0에 가까운지 1에 가까운지로 0/1을 분류한다. sigmoid 함수를 사용할 경우 보통 0.5를 기준으로 분류.

여기서는 sigmoid 함수를 사용.


(x1,x2) -> O 또는 X로 구분하는 학습

아래의 검은 색은 학습 데이터로 이미 O, X가 지정되어 있는 데이터이다.

이를 학습하여, 빨간색의 점들을 O, X로 분류해 봤다.

왼쪽, 아래 부분들이 X, 오른쪽 상단 부분들이 O로 분류되는 모습이다. 테스트 데이터(빨간색)도 잘 분류하였다.

# deep learning test

# logistic regression( Binary classfication) multi vars.

#         ADD learning.... y=x2+x3 and

#         Decide big or low than 10


PLOTSHOW=TRUE


# training , X1=1 (bias)

X=matrix( c(1,1,1, 1,2,3, 1,4,2, 1,2,2, 1,5,4,

            1,7,4, 1,2,9, 1,7,7, 1,10,3, 1,9,4), byrow = T, ncol=3 ) 


# training result Y

Y=matrix( c(0, 0, 0, 0, 0, 

            1, 1, 1, 1, 1) ) 


# searching parameter, w1=bias 

W=c(0, 0, 0)



# drawing 

if ( PLOTSHOW ) {

  plot(1:10,1:10,type="n")

  pchs = vector(length = nrow(X))

  pchs[which(Y==0)]="X"

  pchs[which(Y==1)]="O"

  points(X[,2], X[,3], pch=pchs)

}





# G(X,W)=1/(1+e^-z)   , z=WX

G = function (X, W) {

  Z=X %*% W

  G = 1/(1+exp(-Z))

  return (G)

}



Cost =function (X, W, Y) {

  m = nrow(X)

  # Cost(W) = -1/m Sigma( y log(H(x))+(1-y)log(1-H(x)) )

  return ( (-1)/m * sum(Y*log(G(X,W)) + (1-Y)*log(1-G(X,W))) )

}



Gradient = function (X, W, Y, alpha) {

  m = nrow(X)

  W = W - alpha/m * ( t(X) %*% (G(X,W)-Y) )

  

  # w=w-alpha*cost'

  # cost' = -1/m Sigma ( X( (y-1)e^wx + Y) /(e^wx+1) )

  

  #W = W + alpha/m * ( t(X) %*% (((Y-1)*exp(X%*%W)+Y) / (exp(X%*%W)+1)) ) 

  return (W)

}


print( Cost(X, W, Y) )


#learning

alpha=0.05

for ( i in 1 : 6000 ) {

  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(runif(10*3, 0, 11), nrow=10, ncol=3)

xmat[,1]=1

#xmat = matrix( c(1,1,1, 1,2,4, 1,4,1, 1,9,2, 1,6,8, 1,3,4,

#                 1,6,6, 1,4,6, 1,6,2), byrow = T, ncol=3 ) 

qy = G( xmat, W )

print (xmat)

print (qy)

threshold=0.5

qy2=ifelse(qy>threshold, 1, 0)

print(qy2)



# drawing 

if ( PLOTSHOW ) {

  pchs = vector(length = nrow(xmat))

  pchs[which(qy2==0)]="X"

  pchs[which(qy2==1)]="O"

  points(xmat[,2], xmat[,3], pch=pchs, col="red")

  

  # abline

  m=- ( W[2]/W[3])

  x1y0= (threshold-W[1])/W[2]

  abline(x1y0, m)

}


출력결과

1] 0.6931472

[1] "cnt= 100  Cost= 0.506130153063577  W1(b)= -0.742347709743049  W2= 0.166960447480382  W3= 0.13719656124762"

[1] "cnt= 200  Cost= 0.426904719548934  W1(b)= -1.36454376946518  W2= 0.21941982410039  W3= 0.211042797611876"

[1] "cnt= 300  Cost= 0.371538453508252  W1(b)= -1.88474084142892  W2= 0.263640326808228  W3= 0.27307497177045"

... 학습

[1] "cnt= 5900  Cost= 0.0989403091216031  W1(b)= -9.1090676929688  W2= 0.894710399352723  W3= 1.08049771083572"

[1] "cnt= 6000  Cost= 0.0982119304342858  W1(b)= -9.16885104353332  W2= 0.900021687190386  W3= 1.08680663800592"

      [,1]      [,2]      [,3]

 [1,]    1 6.5452887  8.024256

 [2,]    1 9.5209285  9.637048

 [3,]    1 6.8177543  1.780934

 [4,]    1 3.6139041  2.678026

 [5,]    1 0.6012657  7.200270

 [6,]    1 9.5897683  6.282960

 [7,]    1 7.7645759  4.530263

 [8,]    1 7.2534271  7.010700

 [9,]    1 9.8989604  2.489668

[10,]    1 1.0309055 10.951213

           [,1]

 [1,] 0.9956916

 [2,] 0.9999485

 [3,] 0.2502662

 [4,] 0.0471662

 [5,] 0.3095129

 [6,] 0.9981496

 [7,] 0.9395143

 [8,] 0.9931638

 [9,] 0.9202843

[10,] 0.9749335

      [,1]

 [1,]    1

 [2,]    1

 [3,]    0

 [4,]    0

 [5,]    0

 [6,]    1

 [7,]    1

 [8,]    1

 [9,]    1

[10,]    1

반응형

linear regression을 학습하는데, Normal Equation 방정식으로 풀기.

+Computing parameters analytically

Gradient descent 말고 다른 방법은 많다. 그 중에 하나가  Normal Equation

Alpha (학습률 learning rate)가 필요없다. 반복(iteratoin)도 필요없다.

단,    구하는 비용이 크다.  N x N 매트릭스가 필요.

n이 크면 느림. 100정도? 10000을 초과하면 gradient descent 방식이 낫다.


example)
m=4 (training data count)
n=4 (attributes/features)

=house price=
house size, # rooms , # floor, age of home , price
 x1,            x2,           x3,         x4,                y
data1..
data2.
data3..
data4..
가장 좌측에 x0 컬럼을 추가하여 모두 1로 설정. (x0=1)  (for bias)

X=matrix [ x0, x1, ... x4] ; 4x5 dim ; m x (n+1)
Y=[y] ; 4x1 dim  ; m x 1

Y = X S
X^-1 Y = S
S = (X^-1) Y
그러나 X의 inverse 벡터(X^-1)를 구하려면... 정사각행렬이어야 한다.
그래서 정사각 행렬로 먼저 변환해줘야 한다.

Y = X S
X^t Y = X^t X S     ; 왼쪽에 X^t(X의 transpose)를 곱함

(X^t X )^-1 X^t Y = (X^t X )^-1 (X^t X )  S    ; 왼쪽에 (X^t X)^-1 를 곱한다.
(X^t X )^-1 X^t Y = S

따라서 아래와 같이된다.


Octave에서는 :   pinv(X' * X)* X' * Y

R에서는 : W = solve( t(X) %*% X ) %*% t(X) %*% Y


example을 만들어 보자


# deep learning test

# linear regression ; test.. y=2x+1 learning 

#


# training , X1=1 (bias)

X=matrix( c(1,1,1 , 1,2,3), nrow=3 ) 


# training result Y

Y=matrix( c(3,5,7) ) 


# searching parameter, w1=bias 

W=c(2,2)



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

}


NormalEquation = function (X, W, Y) {

  # no need alpha

  # no iteration

  # S =  inv( t(X) X ) t(X) Y

  W = solve( t(X) %*% X ) %*% t(X) %*% Y

  return (W)

}


print( Cost(X, W, Y) )


#learning

W = NormalEquation(X, W, Y)

print(paste(" Cost=", Cost(X,W,Y), " W1(b)=", W[1,1], " W2=", W[2,1]) )


# predict

qx = c(7,8,9)

xmat = cbind( rep(1, length(qx)), qx)

qy = H( xmat, W )

print (qx)

print (qy)



[1] 1

[1] " Cost= 3.15544362088405e-30  W1(b)= 1  W2= 2"

[1] 7 8 9

     [,1]

[1,]   15

[2,]   17

[3,]   19



'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 (multi variable) 더하기 학습  (0) 2017.05.11
[R] linear regression  (0) 2017.05.11
반응형


더하기를 학습시키는 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


완료



'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  (0) 2017.05.11
반응형

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

}





반응형

미분은 한 자로는 작을 미, 나눌 분. 즉, 아주 작게 나눈다는 뜻이다.

[]  


어느 정도 작게 나눠야하느냐면 극한으로 작게 나누는데, 0은 아니지만, 0에 가까울 정도로 나눈다. 이렇게 말로만 하면 애매할 수 있다.

더 정확히하면 제곱해서 무시될 수 있을 정도로 작은 값이다.

f(x+h) = f(x) + f'(x) h + O(h^2) 에서 lim h->0 일때,   O(h^2)이 무시될 수 있을 정도라면, 

f'(x) = lim ( f(x+h)-f(x) ) / h 이렇게 성립될 수 있다.



먼저 차분은 증가량, 변화량이다. 크기는 상관없다.


미분은 차분의 극한으로 x에 대해 크기가 아주 작아야 한다.

즉, 미분에서의 x의 변화량은 극소.


차분은 두 지점에서의 차이로 본다면 미분은 거의 한 점에서의 차이로 볼 수 있다.


미분은 혼자 존재하는게 아니다.  x를 파라미터로 하는 함수 무엇을 x에 대해 미분하는 것처럼. 기준이 있어야 한다. 

이렇게 무엇(y)을 무엇(x)으로 미분한다는 것이 순간 변화율(dy/dx)인 것이다. 그래프로 치면 접선의 기울기.


함수의 그래프상에서 두 점사이의 평균기울기가 x의 차분(x2-x1)에 대한 y의 차분(y2-y1)을 의미한다면,  한 점에서의 기울기(접선의 기울기, 순간변화율)가 해당 지점에서의 미분값이다.




미분

함수 f(x)에서 주어진 점(a,   x가 a일 때)에서의 접선의 기울기. (기울기=탄젠트 값)

= f'(a) 


미분값이 존재하려면? 좌극한=함수값=우극한   (-> 해당 점에서 이 함수는 당연히 연속이다.)


위와 같이 미분을 정의할 수 있다. x의 극소변화에 대한 함수의 출력값의 변화량의 비율;   y변화량/x변화량  =>  기울기   => x변화량이 극한으로 0에 가깝게 한다. 순간변화율. 접선의 기울기.



다른 방법으로는

x-a를 h로 치환하면 위와 동일하다.



ex)

f(x) = x^2

미분 정의로 부터 주어진 함수를 미분할 수 있다.




다른 방법으로는

일 때 C가 바로 f'(x)이다.. 

Taylor Series 나 Geometric Series 등을 이용하여 h에 대한 power series로 정리하여 미분을 구할 수도 있다.



ex) 

위에서 C를 구하면 x에서의 미분값이 된다.

따라서 C 값인 n x^(n-1)이 바로 f'(x)가 된다.


ex)

따라서 f'(x) = -sin x



ex)

따라서 f'(x) = e^x




'Math' 카테고리의 다른 글

최소제곱법  (0) 2019.03.26
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[적분] 곡선의 길이 계산2  (0) 2017.05.08
[적분] 곡선의 길이 계산  (0) 2016.09.06
[적분] 적분에 대하여... 넓이,부피,겉넓이  (1) 2016.09.06
반응형

전에는 곡선 좌표들이 (x,y)일때, y=f(x)와 같은 함수가 있을 경우에 구해봤다.


이번에는 x=f(t), y=g(t)라는 각각의 함수들이 존재할 경우이다.

x=f(t)에서 t를 구해 g(t)에 대입하여 y=h(x)꼴로 구할수 있다면 이전 방식으로도 가능하지만, h(x)를 구하기 어려운 경우에는 f와 g를 이용하여 구해야 한다.


전과 마찬가지로 곡선의 작은 조각을 적분하는 방식으로 길이를 구한다.


t 지점에서 t의 미세변화량(dt)에 대한 x의 변화량(dx)과 y의 변화량(dy)은 아래와 같다.

따라서 t 지점에서의 미세한 곡선의길이는 

이 delta l을 모두 합친다.

아래와 같이 길이를 구할 수 있는데,

여기서 t가 a~b구간이라고 하면,  t = a+ ((b-a)/n) * i 이고  dt=(b-a)/n 이다.

(Sigma에 대해 극한을 하게 되면 이를 적분으로 계산할 수 있다.  무한급수를 정적분으로 변환.)


위 dl에서 dt를 밖으로 빼주게 되면 아래와 같이 되고



이를 t가 a~b로 변화할때의 곡선의 길이













'Math' 카테고리의 다른 글

최소제곱법  (0) 2019.03.26
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산  (0) 2016.09.06
[적분] 적분에 대하여... 넓이,부피,겉넓이  (1) 2016.09.06
반응형


곡선의 길이를 측정해 보자.


 그래프가 있다고 하자.

특정 구간 x가 a~b 범위에 있을 때 f(x) 그래프가 그어진 길이를 계산하자.


직접 길이를 구할 수 없으니, 쪼개서 합치자... 적분...


작은 곡선 조각의 길이를 구해서 합치면 전체 곡선의 길이는 아래와 같이 된다. 



먼저 x축을 아주 작게 쪼갠다...   이 한 조각의 가로 길이는 

로 0에 아주 가깝다.   

그리고 이렇게 쪼갠 조각의 곡선을 보면 직선과 같은 형태로 직각삼각형의 빗변의 길이가 된다. 

피타고라스 정리로 계산해 보면...

 이 된다.

y의 변화량은 f(x)의 변화량이다. 

dy = f(x+dx)-f(x)





작은 곡선 조각을 dx의 배수 형태로 만들었다.

이제 이 조각을 적분 기호로 합치면 전체 곡선의 길이가 된다.


따라서

x가 a~b 구간에서 y=f(x)가 움직인 곡선의 길이는





 







'Math' 카테고리의 다른 글

최소제곱법  (0) 2019.03.26
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산2  (0) 2017.05.08
[적분] 적분에 대하여... 넓이,부피,겉넓이  (1) 2016.09.06
반응형


적분에 대하여... 넓이,부피,겉넓이




적분은 적(쌓을 적.. 쌓는다..). 분(나눌 분.. 아주 작게 쪼갠다.) 積分

아주 작게 쪼개서 쌓는 것을 말한다.


왜 굳이 쪼개서 합칠까? 쪼개서 합치면 원래 대로 되는 것인데...


어디에 활용될 수 있을까?


이상하게 생긴 모양의 컵에 물이 담겨있다고 생각해 볼 때, 물의 부피를 알고 싶을 것이다.


그렇다면 물을 비커에 따라 보면 눈금을 읽어보면 바로 부피가 나온다.

이것도 적분으로 볼 수 있을 것이다. 물을 쪼개서 다시 새로운 용기에 담았으니 물의 부피는 그대로이다. 


 의 그래프에서 x축과  x=a, x=b 구간으로 구성된 도형의 넓이를 구하고 싶을 때. 바로 이 적분을 쓰면 된다. 넓이를 계산하기 위해 y 방향으로 촘촘히 자른다고 생각해 보자. 이 때 아주 촘촘하게 자른다면 사각형 모양에 가깝고, 

가로 길이는 0에 가깝지만 0은 아니고, 이를 dx라 한다. 

이 작은 하나의 사각형의 넓이가 f(x) dx 이를 다 합치면 되는데...


넓이

넓이 S = 


는 S자 같이 생겼고, Sum 즉, 합을 의미,  dx라는 것은 x를 아주 작게 쪼갠 값(가로길이)이다.  

f(x)는 y값. 즉 높이이다. f(x) dx 는 가로를 아주 작게 쪼갠 사각형의 넓이가 되고

이를 x가 a에서 b구간까지 변할 때의 S ; 즉 합을 구한다는 의미이다.





여기서 dx의 의미가 중요하다.  

 이렇게도 쓰는 델타 x.

x에 대해 적분한다는 것이다.  x의 아주 작은 변화량.






회전체의 부피


그렇다면 위 그래프를 x축을 기준으로 회전했을 때 생기는 물체의 부피를 계산해보자.



회전체를 y축 방향으로 계속 자르면 모든 조각이 높이가 아주 작은 원기둥이 된다.


이 하나의 원기둥의 부피를 합치면 전체 회전체의 부피가 되는 것이다.


먼저 아주 작은 원기둥  

 에서 r은  이고 높이 h를 자세히 보면 를 의미하게 된다.

즉, 이를 x가 a에서 b까지 dx 로 적분하면 된다.





예를 들어

  라는 직선을 x가 0에서 2r 범위에서 x축으로 회전하면 원뿔이 되는데, 

우리가 아는 원뿔 부피 공식을 적용하면,

 밑넓이는 원인데, 반지름이 x가 2r일때의 y값이다.   x가 2r일때 y값은 r이다. 

즉 반지름이 r인 원의 넓이가 밑넓이가 되고, 

높이 h는 x가 0~2r 범위이니까,  2r이 된다.


그러면 이번엔 적분으로 풀어보자. 동일한 결과가 나오는지...





회전체의 옆면적


선을 적분하면 면이되고 면을 적분하면 부피가 된다. 차원이 올라가는 것이다. 미분은 반대로 차원이 내려간다.


옆면적을 생각해 보니, 선을 적분하면 된다. 이 선은 바로 위에서 아주 작게 쪼갠 원기둥의 둘레이니 원주이다. 그래서 원주를 적분하면 면적이 나오겠다.


그러나 틀렸다. 왜 그런 것인가......

dx가 문제다... 생각해 보면,  dx는 x축 방향을 작게 쪼갠 값이다. 


부피를 구할 때는 dx가 원기둥의 높이의 의미가 있었지만......

옆넓이를 계산할 때는 dx를 사용하면 안된다.... ????  원기둥이 아닌 띠를 잘라폈을 때의 가로길이, 세로길이를 봐야 하는 것이다......  여기서 이 사각형(거의 사각형)의  세로 길이는 원주인  2 pi f(x)이지만,   가로는 dx가 아니라  바로 dx동안 f(x)가 움직인 거리이다.... 

즉, dx를 곱하는게 아니고, 저 작게 자른 f(x) 이동 거리를 곱해야  한다.


곡선의 이동 거리 공식은 (다음에 증명하기로 하고)


 이것을 합친것이 전체 곡선의 길이인데,


위 공식에서 우리가 원하는 것은  x 지점에서의 아주 작은 가로길이 을 dx 대신 사용해야 한다.

.

따라서 옆면적 


결국 적분을 자세히 보면 dx로 적분된 것의 의미를 다시 한 번 관찰해보니,


dx는 x를 0에 가깝게 아주 작게 쪼갰을 때의 값. 즉 극한 0값이 dx인데.

우리가 어떤 넓이든 부피를 구할 때 구하고자 할때 이 dx만큼  y방향으로 자른  조각들의 합으로 볼 수 있다. 


이 아주 작은 조각의 넓이 또는 부피값의 합 (위 공식에서는 옆면적)


(작은조각).  

즉 작은 조각들의 범위가 x가 a~b까지이고, 이 조각들을 합친다.


작은 조각의 크기는 공식에서 위 기호를 뺀 나머지다.





이렇게 생각하고 보니, 적분은 작은조각(작은 길이나 작은 넓이)과 합(integral, sum) 기호로 구성된 것. 

작은 조각은 dx의 몇 배 형태로 나타낸 것.


'Math' 카테고리의 다른 글

최소제곱법  (0) 2019.03.26
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산2  (0) 2017.05.08
[적분] 곡선의 길이 계산  (0) 2016.09.06
반응형


A pleasure to meet you.

I'm really bad with names. 이름을 잘 못 외워요.

I'm really bad with numbers.


What do you do for a living?

I work for an insurance company.

I do freelance work.

I'm a freelancer.

I do my business.

I have a lot on my mind. 머리가 복잡하다.


Do you have any siblings?

I have a brother and a sister.


나는 외동이다.

I'm the only child in the family.

I'm an only child. 


Why don't you take a guess? 알아 맞춰봐.

Do I look that young? 내가 그렇게 어려보여?

I'm in my thirties. 

You don't look your age.

You look my age.







+ Recent posts