本代码注释非常详细,适合初学者,另外,算法的思想在这里:BP网络的基本思想
% Chauncy
% Date:2020年4月30日
close all;
clear;
clc;
%% 初始化输入输出
Num_X=1001;
X=zeros(Num_X,1);
j=1;
for i=-5:0.01:5
X(j)=i;
j=j+1;
end
Y=zeros(Num_X,1);%每一次理想的输出
for i=1:Num_X
Y(i)=sin(X(i)*pi);
if abs(Y(i))<1.0e-10
Y(i)=0;
end
end
%% 初始化参数
Num_cell=3;%神经元个数
w1=rand(Num_cell,1); % 输入层与隐藏层的权矩阵
b1=rand(Num_cell,1); % 隐藏层神经元阈值
w2=rand(Num_cell,1); % 输出层的权矩阵
b2=rand(); % 输出层神经元阈值
threshold=0.005;
Num_gen=4000; %迭代
E=zeros(Num_gen,1);
Out_2=zeros(Num_X,1);%记录每一次的实际输出
for gen=1:Num_gen %循环1000次
temp=0;
for i=1:Num_X
In_1=zeros(Num_cell,1);
Out_1=zeros(Num_cell,1);
% 计算隐藏层输出
for j=1:Num_cell
In_1(j)=X(i)*w1(j)-b1(j);
Out_1(j)=Sigmoid(In_1(j));
end
% 计算输出层输出
Out_2(i)=w2'*Out_1-b2;
%实际输出减去理想输出
E=Out_2(i)-Y(i);
% 更新输出神经元阈值
delta_b2 = -1 * threshold * E;
b2=b2-delta_b2;
% 更新输出神经元权矩阵
delta_w2=zeros(Num_cell,1);
for j=1:Num_cell
delta_w2(j)=E * threshold * Out_1(j);
w2(j)=w2(j)+delta_w2(j);%学习算法 隐含层与输出层
end
% 更新隐藏层神经元阈值
delta_b1=zeros(Num_cell,1);
for j=1:Num_cell
delta_b1(j)=w2(j)*Sigmoid(In_1(j))*(1-Sigmoid(In_1(j)))*(-1)*E*threshold;
b1(j)=b1(j)-delta_b1(j);
end
% 更新隐藏层权矩阵
delta_w1=zeros(Num_cell,1);
for j=1:Num_cell
delta_w1(j)=w2(j)*Sigmoid(In_1(j))*(1-Sigmoid(In_1(j)))*X(i)*E*threshold;
w1(j)=w1(j)-delta_w1(j);
end
end
end
figure(1)
plot(Y,'r');
hold
plot(Out_2,'b');
xlabel('迭代次数');ylabel('函数值');
legend('理想输出','实际输出');
title('迭代曲线');
figure(2)
plot(Y-Out_2,'r');
xlabel('迭代次数');ylabel('实际输出与理想输出的误差');
%% Sigmoid函数
function f=Sigmoid(x)
f=1/(1+exp(-x));
end