1.算法描述
神经网络主要由处理单元、网络拓扑结构、训练规则组成。处理单元是神经网络的基本操作单元,用以模拟人脑神经元的功能。一个处理单元有多个输入、输出,输入端模拟脑神经的树突功能,起信息传递作用;输出端模拟脑神经的轴突功能,将处理后的信息传给下一个处理单元,如图1.1所示。
基本的神经处理单元其等效于人体的神经元,如图2所示,
=>
具有相同功能的处理单元构成处理层。常用的多层感知机由输入层、输出层和若干隐含层组成,神经网络的拓扑结构决定了各处理单元、各层之间信息的传递方式与途径。训练规则利用转换函数进行数据处理的加权及求和,训练网络系统进行模式识别,并将其转换成潜在的输出值。神经网络的基本出发点,就是通过简单函数的多次迭代,实现对复杂映射的拟合和逼近。神经网络能够实现一对一、一对多的映射关系。因此,许多实际问题都可以用神经网络模型来解决。
神经网络的工作过程主要由两个阶段组成,一个阶段是学习期,即训练阶段,此时连接权值可调整,另一个阶段就是工作期,此时,其各个权值固定。
在学习阶段,训练集中已知类别的输入向量将随机输入给神经网络,每次的输入使得PE之间的连接权重根据一种固定的学习规则得到细致的调整,使得网络的输出向正确的方向转变。随着训练过程的推进,网络的性能得到的改善,直到网络中每一个PE都收敛到合适的权重为止。
在神经网络的学习阶段,当网络做出错误的判决的时候,那么通过神经网络的学习,应使得网络减少下次犯同样错误的可能性,通常情况下,系统将会给网络一个随机的权值,然后将信号输入到神经网络,网络将输入的模式进行加权求和、并与门限进行比较,然后进行非线性运算从而得到网络的输出。这个时候系统输出正确和错误的概率是相同的,那么这个时候,系统将正确的输出结果的连接权值增大,从而使下次输入同一个信号的时候,得到正确的输出结果。
通常情况下,按这种方法学习几次后,神经网络将判断的正确率大大提高,一般来说,网络中所含的神经元个数就越多,那么它能够记忆和识别的模式也越多。
当训练结束进入工作期时,权重系数保持不变,此外神经网络的输入是未知类别的向量,输入的信息经过神经元层层传播,最后在输出层上产生输出向量,根据此输出向量可以将对象划分到某一类中,从而实现对象的模式识别。
BP神经网络的网络层包括输入层,隐含层和输出层三个网络层次,其基本结构如下图所示:
基于三层网络结构的BP神经网络具有较为广泛的应用场合和训练效果。
在BP神经网络中,隐含层数量对神经网络的性能有着至关重要的影响,如果隐含层数量过多,会大大增加BP神经网络的内部结构的复杂度,从而降低学习效率,增加训练时间;如果隐含层数量过少,则无法精确获得训练输入数据和输出结果之间的内在规律,增加预测误差。因此,选择合适的隐含层个数具有十分重要的意义。由于隐含层个数的设置没有明确的理论可以计算,通常情况下,采用逐次分析的方法获得,即通过对不同隐含层所对应的神经网络进行预测误差的仿真分析,选择误差最小情况下所对应的隐含层个数。
学习率,即网络权值得更新速度,当学习率较大的时候,网络权值的更新速度快,当网络稳定性会下降;当学习率较小的时候,网络权值的更新速度慢,网络较为稳定。这里选择BP神经网络的学习率方式参考上一章节隐含层的选择方式,即通过对比不同学习率的网络训练误差,选择性能较优的学习率。
BP神经网络的初始网络权值对网络训练的效率以及预测性能有着较大的影响,通常情况下,采用随机生成[-1,1]之间的随机数作为BP神经网络的初始权值
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序`
%BP1~4
KER = 4;%集成个数
W0 = rand(NI,Nh,KER);
deltaW0 = zeros(NI,Nh,KER);
dW0 = zeros(NI,Nh,KER);
W = rand(Nh,No,KER);
deltaW = zeros(Nh,No,KER);
dW = zeros(Nh,No,KER);
ERR = [];
Index = 1;
while(Index<=Max_iteration)
Index
jj=1;
error2 = zeros(Len,KER);
while(jj<=Len)
for k=1:No;
d(k)=T(jj);
end
for i=1:NI;
x(i)=P(jj,i);
end
%集成多个BP神经网络
for bpj = 1:KER
for j=1:Nh%BP前向
net=0;
for i=1:NI
net=net+x(i)*W0(i,j,bpj); %加权和∑X(i)V(i)
end
y(j)=1/(1+exp(-net));
end
for k=1:No
net=0;
for j=1:Nh
net=net+y(j)*W(j,k,bpj);
end
%输出值
o(k)=1/(1+exp(-net));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
errortmp=0.0;
for k=1:No
errortmp=errortmp+(d(k)-(o(k)))^2;%传统的误差计算方法
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
error2(jj,bpj)=0.5*errortmp/No;
for k=1:No%BP反向计算
yitao(k)=(d(k)-o(k))*o(k)*(1-o(k));%偏导
end
for j=1:Nh
tem=0.0;
for k=1:No
tem=tem+yitao(k)*W(j,k,bpj);
end
yitay(j)=tem*y(j)*(1-y(j));%偏导
end
。。。。。。。。。。。。。。。。。。。。。。。。。。
end
jj=jj+1;
end
%BP训练结束
error = sum(mean(error2));
%误差是否达到精度
if error<Paim;
break;
end
Index = Index+1;
ERR = [ERR,error];
end