?? bp_method.m
字號:
function[e,e_fan]=bp_method(shuju,fanhua_shuju)
%bp算法
[kk,ss]=size(shuju); %獲得樣本數(shù)據(jù)的個數(shù)
[kk2,ss2]=size(fanhua_shuju);
A=input('輸入:輸入層節(jié)點數(shù):');
B=input('輸入:輸出層節(jié)點數(shù):');
ll=input('輸入:隱含層和輸出層數(shù)之和:'); %隱含層+輸出層共ll層
uu=input('輸入:學習速率:');
aa=input('輸入:動量因子:');
hh=input('輸入:訓練次數(shù):');
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]; %包括輸入層在內(nèi)的,每層的節(jié)點數(shù)
jiedian_max=input('輸入:節(jié)點數(shù)最大值:');
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個樣本循環(huán)
ee=0;
ee2=0;
ee3=0;
ee5=0;
%--------------3
for l=1:ll %第l層
%---------------4
for j1=1:jiedian(l+1) %第l層的節(jié)點
w=wx(j1,1:jiedian(l),l);
if l==1
net(l,j1)=w*shuru(k,:)' ; %第一個隱含層的net要用到輸入層數(shù)據(jù)
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個樣本循環(huán)
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層的節(jié)點
w=wx(j3,1:jiedian(l3),l3);
if l3==1
net(l3,j3)=w*fanhua_shuru(k3,:)' ; %第一個隱含層的net要用到輸入層數(shù)據(jù)
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 + -