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

📄 bp.m

📁 人工智能
💻 M
字号:
x0=0:0.025:1;
x=x0(1,[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40]);
x=x';
  d=[0.0250    0.0749    0.1247    0.1741    0.2231    0.2715...
    0.3193    0.3663    0.4123    0.4573    0.5012    0.5438...
    0.5851    0.6249    0.6631    0.6997    0.7345    0.7675...
    0.7986    0.8277];
d=d';
x2= x0(1,[3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41]);
x2=(x2)';
 d2=[0.0500    0.0998    0.1494    0.1987    0.2474    0.2955...
    0.3429    0.3894    0.4350    0.4794    0.5227    0.5646...
    0.6052    0.6442    0.6816    0.7174    0.7513    0.7833...
    0.8134    0.8415];
d2=d2';
%初始化
w1=rand(5,20,1);       %权值 
w2=rand(20,5,1);
y=zeros(20,1);         %实际输出

u1=zeros(5,1);
v1=zeros(5,1);
u2=zeros(20,1);
v2=zeros(20,1);

%权值调整的初始化
s2=zeros(20,1);      %局部梯度
s1=zeros(5,1);       
dw1=zeros(5,20);     %权值改变量
dw2=zeros(20,5);
m=zeros(1,90);  
c=zeros(1,90); 
    E=1;
    n=1;    
    l=1;
    h=1;
    while      E > 0.001      %期望误差
     if n>90              %迭代次数
        n;
     return          % 如果超出迭代次数跳出
     else            %否则进行下面操作
            
 %训练:前向计算BP网络每层神经元的输入信号u和输出v
     u1=w1*x;          %5*1   
     v1=1./(1+exp(-u1));
     u2=w2*v1;          
     v2=1./(1+exp(-u2));
     y=v2;              %计算出实际输出
       
%计算误差
     e=zeros(20,1);
     f=zeros(20,1);
     e=d-y;
     f=e.^2;
    
     
     
     
     
     
     
     
     
     
     
     for k=1:19
           f(k+1)=f(k)+f(k+1);
       end
     E=0.5*(f(20));
     
     
     
   %测试:  前向计算BP网络每层神经元的输入信号u和输出v
     u12=w1*x2;          %5*1   
     v12=1./(1+exp(-u12));
     u22=w2*v12;          
     v22=1./(1+exp(-u22));
     y2=v22;              %计算出实际输出
       
%计算误差
  
     e2=d2-y2;
     f2=(e2).^2;
       for b=1:19
           f2(b+1)=f2(b)+f2(b+1);
       end
     E2=0.5*(f2(20));   
     

%误差不满足条件则通过调整权值改进
      for p=1:20
          s2(p)=y(p)*(1-y(p))*(d(p)-y(p));     %21*1
      end
      for j=1:20
          z(j)=w2(j)*s2(j);  %5*1
      end
      for q=1:19
          z(q+1)= z(q) +z(q+1);  %累加
      end
      for i=1:4
          s1(i)=v1(i)*(1-v1(i))*z(20);   %5*1
      end
      g=0.3;      %步长
      a=0.5;      %动量项
           dw2=g*s2*(v1)'+a*dw2;     
               w2=w2+dw2;
           dw1=g*s1*x'+a*dw1;    %21*5     
               w1=w1+dw1;
       E;
       n=n+1;   
      end
      m(l)=E            %记录随n增加E的值
      l=l+1; 
      c(h)=E2
      h=h+1;
      %若误差大则执行WHILE后面语句进行调整
end
%画图
%训练后曲线与测试所得曲线,观察是否逼近
subplot(1,2,1),plot(x,d,':g',x,y,'*r',x2,y2,'*b');
%误差曲线
% l=1:90;
% h=1:90;
l=1:70;
h=1:70;
subplot(1,2,2),plot(l,m(l),'-r',h,c(h),'-g');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -