当前位置:文档之家› 各种BP学习算法MATLAB仿真

各种BP学习算法MATLAB仿真

3.3.2 各种BP学习算法MATLAB仿真根据上面一节对BP神经网络的MATLAB设计,可以得出下面的通用的MATLAB程序段,由于各种BP学习算法采用了不同的学习函数,所以只需要更改学习函数即可。

MATLAB程序段如下:x=-4:0.01:4;y1=sin((1/2)*pi*x)+sin(pi*x);%trainlm函数可以选择替换net=newff(minmax(x),[1,15,1],{'tansig','tansig','purelin'},'trainlm');net.trainparam.epochs=2000;net.trainparam.goal=0.00001;net=train(net,x,y1);y2=sim(net,x);err=y2-y1;res=norm(err);%暂停,按任意键继续Pause%绘图,原图(蓝色光滑线)和仿真效果图(红色+号点线)plot(x,y1);hold onplot(x,y2,'r+');注意:由于各种不确定因素,可能对网络训练有不同程度的影响,产生不同的效果。

如图3-8。

标准BP算法(traingd)图3-8 标准BP算法的训练过程以及结果(原图蓝色线,仿真图+号线)增加动量法(traingdm) 如图3-9。

图3-9 增加动量法的训练过程以及结果(原图蓝色线,仿真图+号线)弹性BP算法(trainrp)如图3-10图3-10 弹性BP算法的训练过程以及结果(原图蓝色线,仿真图+号线)动量及自适应学习速率法(traingdx)如图3-11。

图3-11 动量及自适应学习速率法的训练过程以及结果(原图蓝色线,仿真图+号线)共轭梯度法(traincgf)如图3-12。

图3-12 共轭梯度法的训练过程以及结果(原图蓝色线,仿真图+号线)Levenberg-Marquardt算法(trainlm)如图3-13。

图3-13 Levenberg-Marquardt算法的训练过程以及结果(原图蓝色线,仿真图+号线)3.3.3 各种算法仿真结果比较与分析由上面的仿真结果可以得到下表的比较和下面的结论与分析:表3-2表3-2各种BP学习算法MATLAB仿真结果比较结论与分析:从仿真结果可以看出,标准BP算法、增加动量发、弹性BP算法、动量及自适应学习速率法的收敛速度都不如共轭梯度法和Levenberg-Marquardt法(L-M 算法)收敛速度明显的快。

从仿真结果和均方误差综合来看,只有L-M算法达到了目标误差,可见对高要求的误差来说,L-M算法的优势要明显的多,其余均未达到目标误差;从均方误差的效果来看,所仿真的BP算法的优劣(从优到劣)顺序依次为L-M算法、共轭梯度法、弹性BP算法、动量及自适应学习速率法、增加动量法、标准BP算法。

从仿真效果图可以看出,L-M算法的效果最好,其次是共轭梯度法,其余均有不同范围内的失真。

从误差曲线来看,L-M算法达到了目标误差(较高的误差),标准BP算法的误差曲线较粗,是因为较小范围振荡产生锯齿,在图形中由于间距加大,图形不断重叠而成,收敛速度很慢;增加动量法、弹性BP算法、动量及自适应学习速率法的误差曲线较为平滑,在刚开始收敛较快,在训练步数增加的时候,曲线趋于水平,收敛速度比较慢;共轭梯度法和L-M算法的误差曲线变化较大且产生局部锯齿状,说明不是最优,仍需要进行优化,其中L-M算法达到了目标误差。

共轭梯度法在相邻迭代的正交方向搜索,综合误差曲线可知当接近极值时会产生锯齿形振荡。

再根据前面对各种BP改进算法的描述可知,弹性BP算法不需要进行搜索,需要内存比较小,因此在一些大型网络中比较适用,但是需要很长的训练时间。

对收敛速度要求不高时也可使用动量及自适应学习速率法。

在小型网络中,共轭梯度法仅次于L-M算法,但是L-M算法需要更大的内存做临时存储,对于较大复杂的网络和内存受限的设备来说不是很好的选择,但是对于小型网络来说却是首要选择。

对训练时间允许的条件下,共轭梯度法和弹性BP算法是对复杂大型网络较好的选择。

其中共轭梯度法在训练的时候,训练次数为769次,均方误差为0.00499915,均未达到所设定的要求,产生了“Minimum step size reached, performance goal was not met”的结果。

可能意味着子区间的长度与计算机舍入误差相当,无法继续计算了,原因可能是有奇点(无限小且不实际存在),另外也存在是初值问题,理论上得知:共轭梯度法最大局限是依赖于初值,在有限的迭代次数内可能既不能搜索到全局极值也不能搜索到局部极值。

因此该算法适用于精度要求比较低的高维网络之中。

3.3.4 调整初始权值和阈值的仿真在分析了初始权值设置影响因素对BP神经网络的影响,下面首先通过MATLAB程序段一,通过随机设置权值初始化网络方式获取训练好的阈值和权值,作为MATLAB程序段二的初始化值。

由此进行仿真分析。

如图3-14。

①MATLAB程序段一:x=-4:0.01:4;y1=sin((1/2)*pi*x)+sin(pi*x);net=newff(minmax(x),[1,15,1],{'tansig','tansig','purelin'},'trainlm');net.trainparam.epochs=2000;net.trainparam.goal=0.00001;%初始化网络,用newff创建网络,其权值和阈值初始化函数的默认值是initnw。

%initnw据Nguyen-Widrow规则初始化算法对网络层的权值和阈值进行初始%化,该算法的初始化值,可以使网络层中每个神经元的作用范围近似地在%网络层的输入空间均匀分布。

与纯随机初始化权值和阈值的方法比较,%初始化算法有以下优点:神经元的浪费少(因为所有神经元都分布在输%入空间内);网络的训练速度快(因为输入空间的每一个区域都有神经%元);这里是用rands重新设置权值和阈值。

yers{1}.initFcn='initnw';yers{2}.initFcn='initnw';net.inputWeights{1,1}.initFcn='rands';net.inputWeights{2,1}.initFcn='rands';net.biases{1,1}.initFcn='rands';net.biases{2,1}.initFcn='rands';net=init(net);%查看初始化后的权值和阈值net.iw{1,1}net.b{1}net.lw{2,1}net.b{2}net=train(net,x,y1);%得出训练好的权值和阈值供MATLAB程序段二使用net.iw{1,1}net.b{1}net.lw{2,1}net.b{2}y2=sim(net,x);err=y2-y1;res=norm(err);pauseplot(x,y1);hold onplot(x,y2,'r+');②MATLAB程序段二:x=-4:0.01:4;y1=sin((1/2)*pi*x)+sin(pi*x);net=newff(minmax(x),[1,15,1],{'tansig','tansig','purelin'},'trainlm');net.trainparam.epochs=2000;net.trainparam.goal=0.00001;%从程序段一得出的数据net.iw{1,1}=-0.3740;net.b{1}=-0.1930;net.lw{2,1}=[-20.7192;19.6478;10.9678;-9.4500;21.3555;6.7648;-20.7057;-6.10 23;-9.4889;-12.7880;-15.5183;-13.9643;-21.2201;29.9987;-15.3738];net.b{2}=[21.2768;-16.9303;-7.9953;4.8688;-6.6081;-1.3465;-0.8528;-1.2791;-4 .7658;-15.4970;-9.2069;-10.5259;-20.1442;3.5287;-13.6953];net=train(net,x,y1);y2=sim(net,x);err=y2-y1;res=norm(err);pauseplot(x,y1);hold onplot(x,y2,'r+');(a) 随机设置权值误差曲线图(b)获取训练好的阈值和权值误差曲线图图3-14 两程序段运行后误差曲线图从上面的仿真结果看,第一个程序用随机的初始权值和阈值达到目标误差完成训练需要264个回合,而选用已训练好的权值和阈值仅用167个回合就完成了训练,因此选择合适的初始化权值和阈值将加速网络的训练,大大提高了学习的收敛速度。

因此关于设置网络初始权值和阈值的优化方法是一个值得研究的问题。

3.3.5 其他影响因素仿真在算法选择上,在下面的仿真中将使用L-M算法测试其他影响因素,比如通过选择不同的激活函数、修改学习步长和目标误差等观察对仿真曲线的影响程度。

如果将输入层激活函数设置为purelin,x=-4:0.1:4,epochs=1000,goal=0.001,其余不变则会产生如下结果:经过多次反复实验,有时不能达到目标误差,有时又很快达到目标误差,且仿真效果会产生不同程度的失真或有时效果很好。

如果将输入层激活函数设为tansig,则学习很快收敛且达到目标误差,仿真效果很好,且多次仿真结果比较稳定,明显要比输入层激活函数设为purelin要好。

如果将这三层神经元的激活函数都设置为tansig的话,在多次试验中,训练回合数为1000,均未达到目标误差0.001的要求。

3.4 BP神经网络在样本分类中的应用3.4.1问题的提出这是一个用BP神经网络来将不同的混合在一起的数据或者样本进行分类的例子。

利用上述研究的结果,采用15个隐层节点。

我们先自己随机的输入两个样本:%产生训练样本与测试样本,每一列为一个样本P1 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];T1 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];P2 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];T2 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];%然后再将样本归一化处理,这样有利于我们简便、准确、定量结果。

相关主题