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