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

📄 bp1.m

📁 改进的BP算法程序,希望对大家有所帮助.如果需要
💻 M
字号:
%BP neural network
clear;
clc;
close all;
% inputNums=k;%输入层、隐含层、输出层数
% outputNums=n;
% hideNums=m;
k=0.5;
x=[14  1.5  -0.2  -0.2
   25  4.5   0     1
   68  14    0.1   1.4
   32   7    0.1   0.7
   56   12   0.2   1.2
   10   2.4  0.1   0.3
   17   3.8   0.2  0.1
   6    1.5   0.1   0
   -3   -0.3   0  -0.8 
   3    0.3    0   0.8];
for i=1:4
x=[x;x];
end
fc=[2*k*(0.5-rand(1,1))*7  2*k*(0.5-rand(1,1))*2  2*k*(0.5-rand(1,1))*0.4  2*k*(0.5-rand(1,1))*0.4];
for i=1:159
fc=[fc;2*(0.5-rand(1,1))*k*7  2*k*(0.5-rand(1,1))*2   2*k*(0.5-rand(1,1))*0.4 2 *k*(0.5-rand(1,1))*0.4];
end
F=x+fc;
d=eye(10);
for i=1:4
d=[d;d];
end
inputNums=4;%输入层、隐含层、输出层数
outputNums=10;
hideNums=19;
maxcount=3000;%最大训练次数
samplenum=160;%样本数
precision=0.01;

yitanet=0.001;
yitaUL=0.001;
yitaT=0.001;
alphanet=0.99;
alphaUL=0.99;
alphaT=0.99;%%学习率及动量因子的初始化

count=1;
error=zeros(1,count);
errorp=zeros(1,samplenum);
%%%权值初始化
v=rand(inputNums,hideNums);
deltv=zeros(inputNums,hideNums);
dv=zeros(inputNums,hideNums);
st1=zeros(1,hideNums);
deltst1=zeros(1,hideNums);
dst1=zeros(1,hideNums);

w=rand(hideNums,outputNums);
deltw=zeros(hideNums,outputNums);
dw=zeros(hideNums,outputNums);
st2=zeros(1,outputNums);
deltst2=zeros(1,outputNums);
dst2=zeros(1,outputNums);

Ui=ones(1,hideNums);
Uj=ones(1,outputNums);
Ti=ones(1,hideNums);
Tj=ones(1,outputNums);
Li=zeros(1,hideNums);
Lj=zeros(1,outputNums);

% samplelist=[1,0,0;0,1,0;0,0,1];
% expectlist=[1,0,0;0,1,1;0,0,1];
samplelist=F;
expectlist=d;
while (count<=maxcount)
    c=1;
  while (c<=samplenum)
      for j=1:outputNums
        Y(j)=expectlist(c,j);%获得期望输出的向量
       end
    
      for l=1:inputNums
        I(l)=samplelist(c,l);%获得输入的向量(数据)
      end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%前向Forward();
    %隐含层 
    tic;
    for i=1:hideNums
        neti(i)=0.0;
            for l=1:inputNums
                neti(i)=neti(i)+I(l)*v(l,i);
            end
        neti(i)=neti(i)+st1(i);
        H(i)=(Ui(i)-Li(i))/(1+exp(-neti(i)/Ti(i)))+Li(i);
     end
    %输出层
    for j=1:outputNums
    
       netj(j)=0.0;
     for i=1:hideNums
       netj(j)=netj(j)+H(i)*w(i,j);
     end
     netj(j)=netj(j)+st2(j);
     O(j)=(Uj(j)-Lj(j))/(1+exp(-netj(j)/Tj(j)))+Lj(j); 
   end
  %BpError(c);
  errortmp=0.0;
   for j=1:outputNums
     errortmp=errortmp+((Y(j)-O(j))^2);
   end
    errorp(c)=1/10*errortmp; 
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%反向%Backward();
    for j=1:outputNums
     deltnetj(j)=-(O(j)-Uj(j))*(O(j)-Lj(j))/(Tj(j)*(Uj(j)-Lj(j)))*(Y(j)-O(j));
     deltUj(j)=1/(1+exp(-netj(j)/Tj(j)))*(Y(j)-O(j));
     deltLj(j)=(1-1/(1+exp(-netj(j)/Tj(j))))*(Y(j)-O(j));
     deltTj(j)=netj(j)*(O(j)-Uj(j))*(O(j)-Lj(j))/((Tj(j)^2)*(Uj(j)-Lj(j)))*(Y(j)-O(j));
    end
     double tem1;double tem2;double tem3;double tem4;
     tem1=0.0;tem2=0.0;tem3=0.0;tem4=0.0;
     for i=1:hideNums
        for j=1:outputNums
           tem1=tem1+deltnetj(j)*w(i,j);
           tem2=tem2+deltUj(j)*w(i,j);
           tem3=tem3+deltLj(j)*w(i,j);
           tem4=tem4+deltTj(j)*w(i,j);
        end
     deltneti(i)=-tem1*(H(i)-Ui(i))*(H(i)-Li(i))/(Ti(i)*(Ui(i)-Li(i)));
     deltUi(i)=tem2*1/(1+exp(-neti(i)/Ti(i)));
     deltLi(i)=tem3*(1-1/(1+exp(-neti(i)/Ti(i))));
     deltTi(i)=tem4*neti(i)*(H(i)-Ui(i))*(H(i)-Li(i))/((Ti(i)^2)*(Ui(i)-Li(i)));
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%调整各层权值
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%输出层调整
   %%%%%%%%%%%%%%%%权值调整
   for i=1:hideNums
     for j=1:outputNums
        deltw(i,j)=yitanet*deltnetj(j)*H(i);
        w(i,j)=w(i,j)+deltw(i,j)+alphanet*dw(i,j);
        dw(i,j)=deltw(i,j);
      end
    end 
    %%%%%%%%%%%%%%阈值调整 
    for j=1:outputNums
        deltst2(j)=yitanet*deltnetj(j); 
        st2(j)=st2(j)+deltst2(j)+alphanet*dst2(j);
        dst2(j)=deltst2(j);
    end
    %%%%%%%%%%%%%U,L,T调整
    %调整U
     for j=1:outputNums
        deltUj(j)=yitaUL*deltUj(j); 
        dUj(j)=deltUj(j);
        Uj(j)=Uj(j)+deltUj(j)+alphaUL*dUj(j);    
    end
    %调整L
     for j=1:outputNums
        deltLj(j)=yitaUL*deltLj(j);
        dLj(j)=deltLj(j);
        Lj(j)=Lj(j)+deltLj(j)+alphaUL*dLj(j);
    end
    %调整T
     for j=1:outputNums
        deltTj(j)=yitaT*deltTj(j);  
        dTj(j)=deltTj(j);
        Tj(j)=Tj(j)+deltTj(j)+alphaT*dTj(j);
     end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%隐含层调整
%%%%%权值调整
for l=1:inputNums
  for i=1:hideNums
     deltv(l,i)=yitanet*deltneti(i)*I(l);
     v(l,i)=v(l,i)+deltv(l,i)+alphanet*dv(l,i);
     dv(l,i)=deltv(l,i);
    end
end
%%%%%阈值调整 
for i=1:hideNums
    deltst1(i)=yitanet*deltneti(i);
    st1(i)=st1(i)+deltst1(i)+alphanet*dst1(i);
    dst1(i)=deltst1(i);
end
%调整U
for i=1:hideNums
   deltUi(i)=yitaUL*deltUi(i);
   dUi(i)=deltUi(i);
   Ui(i)=Ui(i)+deltUi(i)+alphaUL*dUi(i);
   
end
%调整L
for i=1:hideNums
    deltLi(i)=yitaUL*deltLi(i);
    dLi(i)=deltLi(i);
    Li(i)=Li(i)+deltLi(i)+alphaUL*dLi(i);
end
%调整T
for i=1:hideNums
    deltTi(i)=yitaT*deltTi(i);  
    dTi(i)=deltTi(i);
    Ti(i)=Ti(i)+deltTi(i)+alphaT*dTi(i);  
end
%end
c=c+1;
end
    double tmp;
    tmp=0.0;
    for i=1:samplenum
      tmp=tmp+errorp(i);%*errorp(i)
    end
    tmp=tmp/c;
    error(count)=1/2*sqrt(tmp);

    if (error(count)<precision)
      break;
    end
    count=count+1;%训练次数加1
end
toc;
p=1:count-1;
plot(p,error(p),'-'); 
%网络测试
X_test=[14  1.5  -0.2  -0.2
   25  4.5   0     1
   68  14    0.1   1.4
   32   7    0.1   0.7
   56   12   0.2   1.2
   10   2.4  0.1   0.3
   17   3.8   0.2  0.1
   6    1.5   0.1   0];
[p,q]=size(X_test);
for m=1:p
    for l=1:q
    A(l)=X_test(m,l);
    end
    %隐含层
     for i=1:hideNums
        neti(i)=0.0;
            for l=1:q
                neti(i)=neti(i)+A(l)*v(l,i);
            end
        neti(i)=neti(i)+st1(i);
        H(i)=(Ui(i)-Li(i))/(1+exp(-neti(i)/Ti(i)))+Li(i);
     end
    %输出层
     for j=1:outputNums
          netj(j)=0.0;
     for i=1:hideNums
       netj(j)=netj(j)+H(i)*w(i,j);
     end
     netj(j)=netj(j)+st2(j);
     O(j)=(Uj(j)-Lj(j))/(1+exp(-netj(j)/Tj(j)))+Lj(j); 
   end
     j=1;
        for i=1:outputNums
            if O(1)<O(i)
            j=i;
            O(1)=O(i);
            end
        end
    disp('The trouble is:');
    if j==1
    disp(' TCC SYSTEM OFF ');
    end
    if j==2
    disp(' 3.0 BLEED OPEN ');
    end
    if j==3
    disp(' TWO 3.5 BLEED OPEN ');
    end
    if j==4
    disp(' ONE 3.5 BLEED OPEN ');
    end
    if j==5
    disp(' 3.0 AND ONE 3.5 OPEN ');
    end
    if j==6
    disp(' +2% 8TH STAGE BLEED LEAK ');
    end
    if j==7
    disp(' +2% 15TH STAGE BLEED LEAK ');
    end
    if j==8
    disp(' COWL AND ENGINE ANTI-ICE "ON" ');
    end
    if j==9
    disp(' +2 DEG BETA ANGLE SHIFT ');
    end
    if j==10
    disp(' -2 DEG BETA ANGLE SHIFT ');
    end
end



⌨️ 快捷键说明

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