勾配法と確率的最適化による学習例:
# 2変数からなる16種類のロジック x=matrix(c(1,1,1,1,1,0,1,0,1,1,0,0),ncol=4); y=matrix(c(0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,0,1,0, 1,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1),byrow=T,ncol=4) > x # input matrix [,1] [,2] [,3] [,4] [1,] 1 1 1 1 # X0 [2,] 1 1 0 0 # X1 [3,] 1 0 1 0 # X2 > y [,1] [,2] [,3] [,4] [1,] 0 0 0 0 # none [2,] 0 0 0 1 # notX1 & notX2 [3,] 0 0 1 0 # notX1 & X2 [4,] 0 1 0 0 # X1 & notX2 [5,] 1 0 0 0 # X1 & X2 [6,] 0 0 1 1 # notX1 [7,] 0 1 0 1 # notX2 [8,] 1 0 0 1 # {X1 & X2} or {notX1 & notX2} [9,] 0 1 1 0 # {X1 & notX2} or {notX1 & X2} [10,] 1 0 1 0 # X2 [11,] 1 1 0 0 # X1 [12,] 1 1 1 0 # X1 or X2 [13,] 1 1 0 1 # X1 or notX2 [14,] 1 0 1 1 # notX1 or X2 [15,] 0 1 1 1 # notX1 or notX2 [16,] 1 1 1 1 # all # 勾配法 stepSize=0.1;gamma=5;logicID=2; w=matrix(rnorm(3),nrow=1); for (i_tr in 1:2000) { for (i_inst in 1:4){ a=w%*%x[,i_inst,drop=F] s=1/(1+exp(-gamma*a)) w=w+stepSize*(y[logicID,i_inst]-s)*s*(1-s)*gamma*x[,i_inst] } } for (i_inst in 1:4){ a=w%*%x[,i_inst,drop=F] print(1/(1+exp(-gamma*a))) } # 確率的最適化法(焼きなまし法) gamma=2;logicID=2; w=matrix(rnorm(3),nrow=1); err=4;width=1;sTemp=matrix(0,nrow=1,ncol=3);C=0.25 for (i_tr in 1:5000) { wTemp=w+rnorm(3,mean=0,sd=width) for (i_inst in 1:4) { a=wTemp%*%x[,i_inst,drop=F] sTemp[i_inst]=1/(1+exp(-gamma*a)) } errTemp=sum((sTemp-y[logicID,])^2) delta=errTemp-err; prob=1/(1+exp(delta/(C*width))) if (runif(1) < prob) { w=wTemp err=errTemp } width=width*0.99 } for (i_inst in 1:4) { a=w%*%x[,i_inst,drop=F] print(1/(1+exp(-gamma*a))) }