当前位置:文档之家› BP神经网络拟合函数

BP神经网络拟合函数

BP神经网络用于函数拟合的实验
一、实验目的
本实验要求掌握前向型神经网络的基本工作原理及利用反向传播确定权系数的方法,并能在MATLAB仿真环境下设计相应的神经网络,实现对非线性函数的逼近与拟合,并分析影响函数拟合效果的相关因素。

二、实验要求
设计神经网络的基本结构与激励函数,实现对非线性函数y=sin(x)的逼近与拟合,并分析影响函数拟合效果的相关参数(包括激励函数的选择sigmoid、线性函数、权系数的初值、步长的大小、训练样本的多少等),并对比实验效果。

三、实验步骤
1. 确定神经网络的结构
本次实验采用前向型BP神经网络,神经元分层排列,每一层的神经元只接受前一层神经元的输入。

输入模式经过各层的顺序变换后,得到输出层输出。

各神经元之间不存在反馈。

该实验神经网络含输入层和输出层两层神经元,其中输入层含六个神经元,输出层含一个神经元。

输入信号传输到输入层,在输出层得到拟合结果。

2.确定采用的激励函数、拟合方法
选择激励函数为sigmoid的函数,因其便于求导,且值域在(0,1)之间,具有较好的收敛特性。

拟合方法采用梯度下降法,该方法使试验数值沿梯度方向增加有限步长,避免了盲目搜索,提高搜索效率。

3.训练流程
1)初始化各参数
2)开始训练
3)计算误差
4)计算广义误差
5)调整连接权系数,直到误差小于设定值
6)编写程序实现对非线性函数y=sin(x)的逼近与拟合
算法流程图如图4.1所示。

四、实验结果及分析
通过BP网络学习逼近sin(x)函数的实验发现,不同的初值对逼近效果有较大影响。

权系数初值随机选取时,多次运行程序,得到一组较好的拟合结果(见图1),其权系数为w1 =[-2.9880,-1.9267,-1.3569,-1.5064,-0.6377,-2.3899]
w2=[2.0316,2.1572,-1.1427,-1.3108,-0.6328,-1.8135],阈值yw1
=[-11.3291,-4.0186,-6.6926,-7.6080,-0.5955,-2.1247],yw2 =-0.4377。

图1
固定选取初值为较好的拟合结果的权系数w1,w2及阈值yw1,yw2,改变其学习步长,发现适当步长可以使网络拟合得更好,但过小及过大的步长都会加大误差(见图2.1,图2.2,图2.3),图2.1设置的步长为0.2,最终拟合误差在0.1左右,图2.2设置的步长为0.02,最终拟合误差接近0.02,图2.3设置的步长为0.002,最终拟合误差在0.03左右。

由此可见,步长在0.02时,拟合得最好,误差最低。

图 2.1
图 2.2
图 2.3
固定选取初值为较好的拟合结果的权系数w1,w2及阈值yw1,yw2,取步长为0.02,改变样本数n,发现适当样本数可以使网络拟合得更好(见图3.1,图3.2,图3.3),图3.1设置的样本数为10,最终拟合误差虽然趋近于0,但通过图像我们可以直观地看出,样本数过少使BP网络拟合出的是分段函数,而不是平滑的sin(x),图3.2设置的样本数为30,最终拟合误差接近0.02,图2.3设置的样本数为300,最终拟合误差接近0.004,但是通过逼近图像可以直观看到,300的样本数拟合程度并不如30样本数的好。

可见,样本数为30时,拟合得最好,误差最低。

图 3.1 图 3.2
图 3.3
固定选取初值为较好的拟合结果的权系数w1,w2及阈值yw1,yw2,取步长为0.02,样本数为30,改变学习次数,发现学习次数越多,BP网络拟合越好,但是达到一定程度后,因为学习要求的存在(均方差小于0.008),学习次数对拟合性的影响便会达到饱和,增加学习次数对拟合程度影响不大(见图4.1,图4.2,图4.3)。

图4.1设置的学习次数为3000,最终拟合误差接近0.02,图4.2设置的学习次数为30000,最终拟合误差0.02左右,图4.3设置的学习次数为300000,最终拟合误差还是在0.02左右。

可见,学习次数为30000时,就已经足够。

图 4.1 图 4.2
图 4.3
通过以上实验对比发现,选取初值为较好的拟合结果的权系数w1,w2及阈值yw1,yw2,取步长为0.02,样本数为30,学习次数为30000,在不改变BP网络内部结构的情况下拟合程度最好。

改变BP网络结构,把第一层6个神经元改为3个神经元,权系数和阈值初值随机选取,步长0.02,样本数30,选取学习次数为3000时(如图5.1),可以发现拟合度十分差,而最大学习次数到30000时(如图5.2),拟合程度改善不少,最终误差接近于0,进一步证明学习次数越大,BP网络拟合程度比较好。

图 5.1
图 5.2
改变BP网络结构,把第二层神经元的激励函数改为sigmoid函数,第一层神经元依然为6个,权系数和阈值初值随机选取,步长0.02,样本数30,选取学习次数为3000
时(如图6.1),可以发现拟合度十分差,而最大学习次数到30000时(如图6.2),拟合程度改善不少。

但激励函数改为sigmoid函数后,发现BP网络只能拟合sin(x)的前半周期,后半周期输出都为0,这是因为sigmoid函数的值域为[0,1],而sin(x)函数的值域为[-1,1],所以输出层的激励函数不能为sigmoid函数,否则无法拟合sin后半周期。

图 6.1
图 6.2
通过以上实验对比,第一层6个神经元,激励函数为sigmoid函数,第二层1个神经元,激励函数为线性函数,步长0.02,样本数30,选取学习次数为30000时,BP网络拟合sin函数程度最好。

四、MATLAB编程代码
function bpsin
%用BP神经网络拟合sin(x)函数,两层神经元,第一层六个,激励函数为sigmoid函数,第二层一个,激励函数为线性函数。

%********初始化*******************************
l=0.2; %学习步长
n=30; %输入样本数
cell=6; %第一层神经元数
times=3000; %学习次数
x=(linspace(0,2*pi,n));%选取样本点
t=sin(x); %学习拟合的函数
w1=rand(cell,1)*0.05; %第一层连接权系数的初始值
w2=rand(1,cell)*0.05; %第二层连接权系数的初始值
yw1=rand(cell,1)*0.05; %第一层阈值初始值
yw2=rand*0.05; %第二层阈值初始值
y=rand(1,n)*0.05; %输出初始值
counts=1; %计数
e=zeros(1,times); %均方差
%***************学习过程*************************
for i=1:times
ei=0;
for a=1:n %遍历样本
net1=w1*x(a)-yw1;
out=logsig(net1); %第一层输出
net2=w2*out-yw2;
%y(a)=logsig(net2);
y(a)=net2; %第二层输出(y)
%det2=(t(a)-y(a))*y(a)*(1-y(a));
det2=(t(a)-y(a));
%det2
det1=((det2*(w2)').*out).*(1-out);
w1=w1+det1*x(a)*l; %更新权系数
w2=w2+(det2*out)'*l;
yw1=-det1*l+yw1;
yw2=-det2*1+yw2;
ei=ei+det2^2/2; %累积误差
e(i)=ei;
end
if ei<0.008
break;
end
counts=counts+1;
end
%************逼近曲线****************
for a=1:n
net1=w1*x(a)-yw1;
out=logsig(net1);
net2=w2*out-yw2;
%y(a)=logsig(net2);
y(a)=net2;
end
%***********画图*******************
subplot(2,1,1)
plot(x,t,'b-',x,y,'k*-'); %画sin函数及bp拟合图grid on;
title('BP method, y=sin(x)');
xlabel('x');
ylabel('y=sin(x)');
if(counts<times)
count=1:counts;
sum=counts;
else
count=1:times;
sum=times;
end
subplot(2,1,2);
plot(count,e(1:sum)); %画误差图grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('均方误差');
end。

相关主题