📄 bp1.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 + -