📄 bp.m
字号:
%BP网络的第一阶段学习期(训练加权系数Wki,Wij)
%初始化
Ir=0.7; %训练系数
err_goal=0.0001; %目标误差
max_epoch=1000; %最大训练次数
a=0.8; %惯性系数(动量因子)
%提供两组训练集和目标值(5输入,3输出)
X=[0.1 0.5 0.9];
T=[0.1 0.5 0.9];
%初始化Wki,Wij(M为输入节点j的数量;q为隐层节点i的数量;L为输出节点k的数量)
[M N]=size(X);
q=4;
[L N]=size(T); %N为样本对数
u=0.3;
v=-0.3;
Wij=v+(u-v)*rand(q,M); %隐层到输出层权值初始化
Wki=v+(u-v)*rand(L,q); %输入层到隐层权值初始化
Wij0=zeros(size(Wij));
Wki0=zeros(size(Wki));
compare=0.00001;
%计算隐层各神经元输出
NETi=Wij*X;
for j=1:N
for i=1:q
Oi(i,j)=1/(1+exp(-NETi(i,j)));
end
end
%计算输出层各神经元输出
NETk=Wki*Oi;
for i=1:N
for k=1:L
Ok(k,i)=1/(1+exp(-NETk(k,i)));
end
end
%计算误差函数
e=T-Ok;
error =0.5*mean(mean(e.*e));
for epoch=1:max_epoch
if error<=err_goal
break
else
for i=1:N
%调整输出层加权系数
deltak=diag(Ok(:,i))*diag((1-Ok(:,i)))*(T(:,i)-Ok(:,i));
W=Wki;
Wki=Wki+Ir*deltak*Oi(:,i)'+a*(Wki-Wki0);
Wki0=W;
%调整隐层加权系数
deltai=(deltak'*Wki)*diag(Oi(:,i))*diag((1-Oi(:,i)));
W=Wij;
Wij=Wij+Ir*deltai'*X(:,i)'+a*(Wij-Wij0);
Wij0=W;
%计算隐层各神经元输出
NETi=Wij*X(:,i);
for j=1:q
Oi(j,i)=1/(1+exp(-NETi(j)));
end
%计算输出层各神经元输出
NETk=Wki*Oi(:,i);
for k=1:L
Ok(k,i)=1/(1+exp(-NETk(k)));
end
end
e = T - Ok;
error =0.5*mean(mean(e.*e));
disp(sprintf('Iteration :%5d mse :%12.6f%',epoch,error));
mse(epoch)=error;
end
if error>compare
Ir=1*Ir;
else
Ir=1*Ir;
end
compare=error;
end
%BP网络的第二阶段学习期(根据训练好的Wki,Wij和给定的输入计算输出)
X1=[0.5 ]; %给定输入
[M N]=size(X1);
%计算隐层各神经元输出
NETi1=Wij*X1;
for j=1:N
for i=1:q
Oi1(i,j)=1/(1+exp(-NETi1(i,j)));
end
end
%计算输出层各神经元输出
NETk1=Wki*Oi1;
for i=1:N
for k=1:L
Okk(k,i)=1/(1+exp(-NETk1(k,i)));
end
end
Okk %显示网络输出层的输出
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -