文章目录
题目
要求设计一个BP网络,逼近函数g(x)=1+sin(kpi/2x),实现对该非线性函数的逼近。其中,分别令k=2,3,6进行仿真,通过调用参数得出信号的频率与隐含层借点之间,隐含层节点与函数逼近能力之间的关系。
解析
假设频率参数k=2,绘制逼近的非线性函数的目标函数。
matlab代码如下:
clear all clc k=2; p=[-1:0.5:8]; g=1+sin(k*pi/2*p); plot(p,g,'-'); title('要逼近的非线性函数'); xlabel('时间'); ylabel('非线性函数');
运行后得到目标函数图形:
用newff函数奖励BP网络结构。隐含层神经元数目n可以改变,暂定n=5,输出层有一个神经元。选择隐含层和输出层神经元传递函数分别为tansing函数和purelin函数,网络训练的算法采用Levenberg-Marquardt算法trainlm。
n=5; net=newff(minmax(p),[n,1],{'tansig','purelin'},'trainlm'); %对于初始网络,可以应用sim()函数观察网络输出 y1=sim(net,p); figure; plot(p,g,'-',p,y1,':') title('为训练网络的输出结果') xlabel('时间') ylabel('仿真输出--原函数--')
运行上述代码可以得到网络输出曲线与原函数的比较图:
因为使用newff函数奖励函数网络时,权值和阙值的初始化是随机的,所以网络输出结构很差,根本达不到毕竟函数的目的,每次运行的结果有时也不同。
应用train()函数对网络进行训练前,需要预先设置网络训练参数。将训练时间设置为200,训练精度设置为0.2,其余参数使用默认值。训练神经网络的matlab代码如下:
net.trainParam.epochs=200;%网络训练时间设置为200 net.trainParam.goal=0.2;%网络训练精度为0.2 net=train(net,p,g);%开始训练网络
运行后得到的误差变化过程如下:
对于训练好的网络进行仿真:
y2=sim(net,p); figure; plot(p,g,'-',p,y1,':',p,y2,'--') title('训练后网络的输出结果'); xlabel('时间'); ylabel('仿真输出');
绘制网络输出曲线,并与原始非线性函数曲线以及未训练网络的输出结果曲线相比较,如图:
从图可以看出,相对于没有训练的曲线,经过训练之后的曲线和原始的目标曲线更接近。这说明经过训练后,BP网络对非线性函数的逼近效果更好。
改变非线性函数的频率和BP函数银行层神经元的数目,对于函数逼近的效果要更差一些;隐含层神经元的数目对于网络逼近效果页有一定影响,一般来说,隐含层神经元数目多,则BP网络逼近非线性函数的能力越强。
(暂时写到这,晚上继续编辑本文,做更多的分析)