神经网络在R语言 实现
ti<-proc.time()BP_one_output<-function(input,output,m,fth,sth,w,v){
x<-input;#7*8
y<-output;#8*1,y为向量,每一元素为一个样本输出值
theta<-fth;#11*1
gama<-sth;#标量
if(m!=length(theta)) print("阈值长度错误!")
x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
K<-nrow(x);#8一组样本的维数
J<-ncol(x);#8一共有多少组样本
w<-rbind(w,t(theta));#由7*11变为8*11
v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
#定义函数f
f<-function(h) 1/(1+exp(-h));
epsilon<-alpha<-0.5;
N<-0;#重复学习次数的计数
ei<-as.numeric();#记录每次迭代的平均残差平方和
FW<-1;
while((FW/J)>=0.001){
Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
#2 indicates columns, c(1, 2) indicates rows and columns
Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
D<-f(Z2);#向量,每一元素为一组样本的一个输出值
b<-y-D;
#J组样本的学习
#向量,输出层对隐含层的权值的偏导
FW<-pFW2<-pFW2t_1<-0;
pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
for(t in 1:J){
B3<-b;
FW<-FW+B3*B3;#标量
B2<-f(Z2)*(1-f(Z2))*B3;#标量
pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
if(t==1) v<-v-0.5*epsilon*pFW2
else{
v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
pFW2t_1<-pFW2;
}
B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
if(t==1) w<-w-0.5*epsilon*pFW1
else{
w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
pFW1t_1<-pFW1;
}
}
N<-N+1;
ei<-FW/J;
}
theta<-w;#隐含层阈值
gama<-v;#输出层阈值
w<-w;#输入层对隐含层的权重
v<-v;#隐含层对输出层的权重
list(theta,gama,w,v,N,FW/J,ei)
}
x<-cbind(x1,x2,x3,x4,x5,x6,x7);
x<-t(x);
hidden_threshold<-runif(11);
output_threshold<-runif(1);
w<-matrix(runif(77),7,11);
v<-runif(11);
result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
#输出
cat("\n");
cat("隐含层阈值theta","\n",result[],"\n");
cat("输出层阈值gama","\n",result[],"\n");
w<-as.matrix(result[],7,11);
cat("输入层对隐含层的权重w","\n");
w;
cat("\n");
cat("隐含层对输出层的权重v","\n",result[],"\n");
cat("迭代次数N" ,"\n",result[],"\n");
cat("学习误差FW","\n",result[],"\n");
cat("每次迭代的误差","\n");
plot(result[],type="l",ylab="每次学习误差",xlab="反复学习的次数");
proc.time()-ti
支持~~顶顶~~~ 运行不了啊? 就看看,不说话。 能不能解释一下呢? 这牛逼的你自己编的吗
页:
[1]