データ学習アルゴリズム(データサイエンス・シリーズ:渡辺澄夫先生)



#データ学習アルゴリズム p.52

#三層パーセプトロン

library(dplyr)

data("anscombe")

data=anscombe

X=as.matrix(data[,colnames(data) %in% c("x1","x2","x4")])

Y=as.matrix(data[,colnames(data) %in% c("y1","y2")])

Y[,1]=Y[,1]/max(Y[,1]);Y[,2]=Y[,2]/max(Y[,2])

N=ncol(Y);H=2;M=ncol(X);n=nrow(data)

wij=array(sample(1:9,N*H,replace=T),dim=c(N,H))/100

wjk=array(sample(1:9,H*M,replace=T),dim=c(H,M))/100

ite=10^5

eta=0.01


act_f=function(z){

return(1/(1+exp(-z)))  

}

for(l in 1:ite){

os=act_f(t(wjk%*%t(X)))

fs=act_f(t(wij%*%t(os)))  

delta_i=(fs-Y)*fs*(1-fs)

delta_j=as.matrix(delta_i)%*%as.matrix(wij)*os*(1-os)

dwij=t(delta_i)%*%os

dwjk=t(delta_j)%*%X

wij=wij-eta*dwij

wjk=wjk-eta*dwjk

#print(sum(abs(fs-Y)^2))

}

f_mat=fs

plot(c(1:length(c(Y))),c(f_mat),xlab="index",ylab="predict",xlim=c(1,length(c(Y))),ylim=c(min(c(c(f_mat),c(Y))),max(c(c(f_mat),c(Y)))),col=2,type="o")

par(new=T)

plot(c(1:length(c(Y))),c(Y),xlab="index",ylab="predict",xlim=c(1,length(c(Y))),ylim=c(min(c(c(f_mat),c(Y))),max(c(c(f_mat),c(Y)))),col=3,type="o")




#データ学習アルゴリズム p.67

library(dplyr)

data("anscombe")

data=anscombe

X=as.matrix(data[,colnames(data) %in% c("x1","x2","x4")])

Y=as.matrix(data[,colnames(data) %in% c("y1","y2")])

N=ncol(Y);H=3;M=ncol(X);n=nrow(data)

w=matrix(sample(unique(abs(c(Y))),N*H,replace=T),nrow=N,ncol=H)

guzai=matrix(sample(unique(c(X)),M*H,replace=T),nrow=H,ncol=M)

sig=rep(10,H)

o=function(z,sigma){

return(exp(-apply((X-z)^2,1,sum)/(2*sigma^2)))  

}

o_guzai=function(z,sigma){

return((X-z)/(sigma^2))  

}

o_sigma=function(z,sigma){

return(apply((X-z)^2,1,sum)/(sigma^3))  

}

o_mat=function(z,sigma){

o_mat=array(0,dim=c(n,H)) 

for(j in 1:H){

o_mat[,j]=o(c(z[j,]),sigma[j])  

}

return(o_mat)  

}


o_sigma_mat=function(z,sigma){

o_mat=array(0,dim=c(n,H)) 

for(j in 1:H){

o_mat[,j]=o_sigma(c(z[j,]),sigma[j])  

}

return(o_mat)   

}


ite=10^5

eta=0.001

epsilon=5*10^(-12)

calc_stop=epsilon+1

for(l in 1:ite){

if(calc_stop>epsilon ){  

f_mat=t(o_mat(guzai,sig)%*%t(w))

dw=(f_mat-t(Y))%*%o_mat(guzai,sig)

term=(o_sigma_mat(guzai,sig))*o_mat(guzai,sig)

dsigma=apply((f_mat-t(Y))%*%term*w,2,sum)

dguzai=array(0,dim=c(H,M))

for(i in 1:H){

mat=(t(f_mat-t(Y))%*%w)*o_guzai(guzai[i,],sig[i])

dguzai[i,]=c(t(mat)%*%o_mat(guzai,sig)[,i])

}

w=w-eta*dw

guzai=guzai-eta*dguzai

sig=sig-eta*dsigma

print(sum((f_mat-t(Y))^2))

if(l>1){

calc_stop=sum(((f_mat-f_pre_mat)^2)/(f_pre_mat^2))

}

f_pre_mat=f_mat

}

}



Y=t(Y)

plot(c(1:length(c(Y))),c(f_mat),xlab="index",ylab="predict",xlim=c(1,length(c(Y))),ylim=c(min(c(c(f_mat),c(Y))),max(c(c(f_mat),c(Y)))),col=2,type="o")

par(new=T)

plot(c(1:length(c(Y))),c(Y),xlab="index",ylab="predict",xlim=c(1,length(c(Y))),ylim=c(min(c(c(f_mat),c(Y))),max(c(c(f_mat),c(Y)))),col=3,type="o")