⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.m

📁 标准bp神经网络的五输入三输出,完全用MATLAB语言,不用神经网络工具箱
💻 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 + -