各种BP学习算法MATLAB仿真
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 on
plot(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);