⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp_method.m

📁 bp网络
💻 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 + -