📄 bp_nn.m
字号:
x1=0:0.1:pi/2;
x2=pi/2:0.1:pi;
x3=pi:0.1:1.5*pi;
x4=1.5*pi:0.1:2*pi;
y1=x1-pi/2+1;
y2=sin(x2);
y3=2-2/pi*x3;
y4=sin(x4);
x=[x1,x2,x3,x4];
y=[y1,y2,y3,y4];
ma=max(x);
mi=min(x);
len=length(x);
%归一化
% for i=1:len
% x(i)=(x(i)-mi)/(ma-mi);
% end
totalerr = 0.001;%总误差
totalcount =10000;%最大运算次数
hidenum = 5;%隐含层节点数
w1=rand(hidenum,1)';
b1=rand(hidenum,1)';
w2=rand(hidenum,1)';
b2=0.5;
error =1;
alpha = 0.05;%学习速率
for i=1:totalcount %最大训练次数
for j=1:len
net1=logsig(x(j)*w1'+b1');%%计算第一个输出
net2(j)=w2*net1+b2;%%计算第二个输出
e(j)=y(j)-net2(j);%%计算误差
%%修正权值
s2=-2*e(j);
s1=diag((1-net1).*net1)*w2'*s2;
w2=w2-alpha*s2*net1';
b2=b2-alpha*s2;
b1=b1-alpha*s1';
w1=w1-alpha*s1'*x(j);
e=0+0.5*e(j)*e(j);
end
error = e;
arr(i) =e;
if(error<totalerr)%退出循环条件
break;
end
end
%输出权值和阈值
i
w1
w2
b1
b2
e
% 反归一化
%for i=1:len
% x(i)=x(i)*(ma-mi)+mi;
%end
%绘图输出
figure;
plot(arr);%显示误差
%绘出拟合曲线
figure;
plot(x,y,'r');%实际值
hold on
plot(x,net2,'*b')
hold on%拟合值
%测试
x1=0.1:0.1:2*pi;
ma = max(x1);%寻找最大值
mi = min(x1);%寻找最小值
len = length(x1);
for i=1:len
net3=logsig(x1(i)*w1'+b1');%%计算第一个输出
net4(i)=w2*net3+b2;%%计算第二个输出
end
figure
plot(x,y,'r')
hold on
plot(x1,net4,'*b')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -