📄 bp_method.m
字号:
function[e,e_fan]=bp_method(shuju,fanhua_shuju)
%bp算法
[kk,ss]=size(shuju); %获得样本数据的个数
[kk2,ss2]=size(fanhua_shuju);
A=input('输入:输入层节点数:');
B=input('输入:输出层节点数:');
ll=input('输入:隐含层和输出层数之和:'); %隐含层+输出层共ll层
uu=input('输入:学习速率:');
aa=input('输入:动量因子:');
hh=input('输入:训练次数:');
E=input('输入:误差限:');
shuru=shuju(:,[1:A]);
shuchu=shuju(:,[(A+1):(A+B)]);
fanhua_shuru=fanhua_shuju(:,[1:A]);
fanhua_shuchu=fanhua_shuju(:,[(A+1):(A+B)]);
jiedian=[A 7 B]; %包括输入层在内的,每层的节点数
jiedian_max=input('输入:节点数最大值:');
e_fanhua=zeros(1,hh);
e=zeros(1,hh);
ee4=zeros(1,kk);
ee4_fan=zeros(1,kk);
net=zeros(ll,jiedian_max);
o=zeros(ll,jiedian_max,kk);
f_dao=zeros(ll,jiedian_max,kk);
segma=zeros(ll,jiedian_max,kk);
segma2=zeros(ll,jiedian_max);
ekw=zeros(jiedian_max,jiedian_max,ll);
ew=zeros(jiedian_max,jiedian_max,ll);
wx=rand(jiedian_max,jiedian_max,ll);
w_baocun=zeros(jiedian_max,jiedian_max,ll);
%---------------1
for h=1:hh
%---------------2
for k=1:kk %kk个样本循环
ee=0;
ee2=0;
ee3=0;
ee5=0;
%--------------3
for l=1:ll %第l层
%---------------4
for j1=1:jiedian(l+1) %第l层的节点
w=wx(j1,1:jiedian(l),l);
if l==1
net(l,j1)=w*shuru(k,:)' ; %第一个隐含层的net要用到输入层数据
else
net(l,j1)=w*o(l-1,1:jiedian(l))';
end
o(l,j1,k)=1/(1+exp(net(l,j1)));
f_dao(l,j1,k)=o(l,j1,k)*(1-o(l,j1,k));
if l==ll
ee=o(l,j1,k)-shuchu(k,j1);
ee2=ee*ee;
end
ee3=ee3+ee2;
end
%-----------------4end
end
%-----------------3end
ee4(1,k)=ee3/(2*jiedian(ll+1));
ee5=ee5+ee4(1,k);
if k==kk;
e(1,h)=ee5/kk;
end
%-------------------3'
for l2=ll:-1:1 %第l2层
%------------------4'
for j2=1:jiedian(l2+1)
if l2==ll
segma2(l2,1:jiedian(l2+1))=o(l2,1:jiedian(l2+1),k)-shuchu(k,:); %输出层segma2
else
w2=wx(j2,1:jiedian(l2+2),l2+1);
segma2(l2,j2)=segma(l2+1,1:jiedian(l2+2),k)*w2';
end
segma(l2,j2,k)=segma2(l2,j2)*f_dao(l2,j2,k);
end
%--------------------4'end
if l2~=1
ekw(1:jiedian(l2+1),1:jiedian(l2),l2)=segma(l2,1:jiedian(l2+1),k)'*o(l2-1,1:jiedian(l2),k);
else
ekw(1:jiedian(l2+1),1:jiedian(l2),l2)=segma(l2,1:jiedian(l2+1),k)'*shuru(k,:);
end
end
%---------------------3'end
ew=ew+ekw;
end
%--------------------2end
wx=wx-uu*ew+aa*w_baocun;
w_baocun=-uu*ew+aa*w_baocun;
%-------------------2''
for k3=1:kk2 %kk2个样本循环
ee_fan=0;
ee2_fan=0;
ee3_fan=0;
ee5_fan=0;
%--------------3
for l3=1:ll %第l层
%---------------4
for j3=1:jiedian(l3+1) %第l层的节点
w=wx(j3,1:jiedian(l3),l3);
if l3==1
net(l3,j3)=w*fanhua_shuru(k3,:)' ; %第一个隐含层的net要用到输入层数据
else
net(l3,j3)=w*o(l3-1,1:jiedian(l3))';
end
o(l3,j3,k3)=1/(1+exp(net(l3,j3)));
if l3==ll
ee_fan=o(l3,j3,k3)-fanhua_shuchu(k3,j3);
ee2_fan=ee_fan*ee_fan;
end
ee3_fan=ee3_fan+ee2_fan;
end
%-----------------4end
end
%-----------------3end
ee4_fan(1,k3)=ee3_fan/(2*jiedian(ll+1));
ee5_fan=ee5_fan+ee4_fan(1,k3);
if k3==kk2;
e_fan(1,h)=ee5_fan/kk2;
end
end
plot(e)
hold on
plot(E,'g')
hold on
plot(e_fan,'r')
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -