1.算法描述
BP神经网络是一种具有一个输入层,一个或多个隐含层和一个输出层的多层网络。隐含层和输出层上的每个神经元都对应一个激发函数和一个阈值。每一层上的神经元都通过权重与其相邻层上的神经元相互连接。对于输入层上的神经元其阈值为零,其输出等于输入。图2为单隐含层的BP神经网络的一般结构。BP神经网络隐含层和输出层上的某神经元的输出由下式确定:
BP算法所采用的学习过程(即权值调整过程)由信息的前向传播和误差的反向传播组成。在前向传播过程中,每一层神经元的状态只影响到下一层神经元网络。如果输出层不能得到期望输出,就是实际输出值与期望输出值之间有误差,那么转入反向传播过程,将误差信号沿原来的连接通路返回,通过修改各层神经元的权值,逐次地向输入层传播去进行计算,再经过前向传播过程,这两个过程的反复运用,使得误差信号最小。BP神经网络的隐节点采用输入模式与权向量的内积作为激活函数的自变量,而激活函数采用Sigmoid函数。各调参数对BP网络的输出具有同等地位的影响,因此BP神经网络是对非线性映射的全局逼近。
————————————————
BP神经网络的初始网络权值对网络训练的效率以及预测性能有着较大的影响,通常情况下,采用随机生成[-1,1]之间的随机数作为BP神经网络的初始权值。
本文,通过matlab的BP神经网络工具箱函数newff来构建BP神经网络,通过newff函数构建BP网络,其主要步骤如下:
第一,BP神经网络初始化后,其matlab程序如下:
net = newff(traindata, trainaim, HiddenNum);
其中traindata表示训练数据,trainaim表示训练目标,HiddenNum表示BP神经网络隐含层个数,net表示BP神经网络模型函数。
第二,BP神经网络参数设置,其matlab程序所示:
设置学习率,其matlab程序为 net.trainParam.lr = 0.25;
设置训练误差目标,其matlab程序为net.trainParam.goal = 1e-8;
设置神经网络训练次数,其matlab程序为net.trainParam.epochs = 200;
第三,BP神经网络的训练,其matlab程序所示:
net = train(net,train_data,train_aim);
这里通过train函数对神经网络net进行训练,得到训练后的BP神经网络模型。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
inv=[189.6 244.2 328.5 405.3 487.5 568.6 669.9 801.6 785.9 859.2 979.7 1086.3 1241];
d1=[15.3 16.6 17.2 22.8 37.6 30.8 38.9 50.8 58.2 41.2 55.8 71.7 82.3];
d2=[117.7 140.7 177.8 209.8 247.7 290.8 343.2 337.1 308.1 353.6 350.1 367.2 415.7];
d3=[56.6 86.9 133.5 172.6 202.2 247 287.8 413.7 419.6 464.4 573.8 647.4 742.1];
f=[822.3 959.7 1198.4 1607.5 1997.6 2380.9 2683.8 2798.9 2897.4 3253 3561 3882 4433];
k=1991:1:2003;
% 先赋予0值
p1=zeros(1,13);p2=zeros(1,13);p3=zeros(1,13);t=zeros(1,13);
p1(1)=d1(1);for i=2:13 p1(i)=0.*d1(i)+p1(i-1);end
p2(1)=d2(1);for i=2:13 p2(i)=0.1*d2(i)+p2(i-1);end
p3(1)=d3(1);for i=2:13 p3(i)=0.1*d3(i)+p3(i-1);end
t(1)=f(1);for i=2:13 t(i)=0.1*f(i)+t(i-1);end
b=[p1;p2;p3;t]';
p=[(p1-mean(p1))./std(p1);(p2-mean(p2))./std(p2);(p3-mean(p3))./std(p3)];
tt=(t- mean(t))./std(t);%数据标准化处理,标准化为网络输入p,期望输出tt
%建立网络并训练
net=newff(minmax(p),[4,1],{'tansig','purelin'},'trainlm');
net.iw{1,1}=zeros(size(net.iw{1,1}))+0.5;
net.lw{2,1}=zeros(size(net.lw{2,1}))+0.75;
net.b{1,1}=zeros(size(net.b{1,1}))+0.5;
net.b{2,1}=zeros(size(net.b{2,1}));
net.trainParam.epochs=3000;
net.trainParam.goal =0.000005;
net=train(net,p,tt);
%网络仿真得到网络输出,并计算误差
tt1=sim(net,p);
to=tt1.*std(t)+mean(t);%利用标准化的逆变换得到t1的近似值to
a=zeros(1,13);a(1)=to(1);
for i=2:13 a(i)=(to(i)-to(i-1))*10; end %累减得到近似的实际产值a
r_net=(tt1-tt)./tt;%网络相对误差
r_add=(to-t)./t;%总产值累加数相对误差
r_real=(a-f)./f;%实际总产值相对误差