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^)
'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 |