BP神经网络逼近非线性函数Word格式.docx
《BP神经网络逼近非线性函数Word格式.docx》由会员分享,可在线阅读,更多相关《BP神经网络逼近非线性函数Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
网络初始化。
根据系统输入输出序列(X,Y)确定网络输入层节点数n、隐含层节点数l、输出层节点数m,初始化输入层、隐含层和输出层神经元之间的连接权值ωij,ωjk,初始化隐含层阈值a,输出层阈值b,给定学习速率和神经元激励函数。
步骤2:
隐含层输出计算。
根据输入变量X,输入层和隐含层间连接权值ωij
以及隐含层阈值a,计算隐含层输出H。
j=1,2,…,l
式中,l为隐含层节点数,f为隐含层激励函数,该函数有多种形式,一般选取为
步骤3:
输出层输出计算。
根据隐含层输出H,连接权值ωjk和阈值b,计算BP神经网络预测输出O。
k=1,2,…,m
步骤4:
误差计算。
根据网络预测输出O和期望输出Y,计算网络预测误差e。
步骤5:
权值更新。
根据网络预测误差e更新网络连接权值ωij,ωjk
i=1,2,…,nj=1,2,…,l
j=1,2,…,lk=1,2,…,m
步骤6:
阈值更新。
根据网络预测误差e更新网络节点阈值a,b。
j=1,2,…,l
k=1,2,…,m
步骤7:
判断算法迭代是否结束,若没有结束,返回步骤2。
2.3附加动量法
经典BP神经网络采用梯度修正法作为权值和阈值的学习算法,从网络预测误差的负梯度方向修正权值和阈值,没有考虑以前经验的积累,学习过程收敛缓慢。
对于这个问题,可以采用附加动量法来解决,带附加动量的算法学习公式为
式中,ω(k),ω(k-1),ω(k-2)分别为k,k-1,k-2时刻的权值;
a为动量学习率,一般取值为0.95。
2.4程序流程图
三、程序简述
本次实验选择逼近的非线性函数为y=sin(x1)+cos(x2)。
程序首先创建用于神将网路训练的样本数据,取在区间[-4.5,4.5]之间均匀分布的数值,由于有两个自变量,所以一共产生361组输入输出数据。
其次确定神经网络的训练参数,比如隐含层节点数、学习速率、学习目标、隐含层和输出层的权值阈值等,其中隐含层节点数在参考相关资料后确定为9,这样不仅在训练结束后可以获得较小的误差,而且也不会使训练次数过大从而耗时较长;
程序中隐含层和输出层的权值阈值是采取随机产生的方法获得的,并且之后的修改方法采用了附加动量法,减少训练次数加快网络收敛。
由于matlab可以采用矩阵运算的形式,所以输入输出数据和网络权值阈值构建生成相应的矩阵,这样可以在全部数据遍历一次之后再进行权值阈值修改,同样可以缩短网络训练时间。
最后,根据修正后的权值阈值就输入数据预测网路输出,和期望输出数据进行比较,计算输出误差,直至训练结束根据训练结果画出相应图像。
最初程序中神经网络训练只有当最大预测误差小于5%之后才停止,实际情况中,当输出接近0时只要有微小的变化就会产生较大的误差,这样不仅导致网络训练次数增加耗时长,还会使网络收敛速度变慢;
在经过查询相关资料之后,训练结束条件除了最大预测误差小于5%之外,还增加了目标函数,目标函数是取所有误差的平方和,当目标函数的计算值小于预期目标时同样也会停止训练,此时默认训练已达目标。
在实际检验过程中发现,加入目标函数后不仅可以有效地改善收敛速度慢耗时长的问题,同时各个坐标点的预测误差也在期望值之内,达到了实验要求。
四、实验结果
由于程序中权值阈值的取值是随机的,所以取其中一次的结果展示。
最大训练次数为15329,训练结束后的最大误差为2.5331。
图1非线性函数图像
图2网络图
图3误差曲线
程序:
clc
clear
%创建输入数据,产生361组输入输出数据
row=1;
fori=-4.5:
0.5:
4.5
forj=-4.5:
input(row,1)=i;
input(row,2)=j;
output(row,1)=sin(input(row,1))+cos(input(row,2));
row=row+1;
end
end
%神经网络结构
inputnum=2;
%输入层节点数
hiddennum=9;
%隐含层节点数
outputnum=1;
%输出层节点数
%网络参数
learnSpeed=0.0003;
%学习率
learnGoal=0.05;
%目标
%隐含层及输出层的权值和阈值
w1=0.2*rand(hiddennum,inputnum)-0.1;
b1=0.2*rand(hiddennum,1)-0.1;
w2=0.2*rand(outputnum,hiddennum)-0.1;
b2=0.2*rand(outputnum,1)-0.1;
%取训练数据和预测数据
%采用全部样本遍历一次后再进行权值阈值调整
%调整采用附加动量法,加快收敛速度,减少遍历次数
input_train=[inputones(361,1)]'
;
output_train=output;
HH=[w1b1];
OO=[w2b2];
collectHH=[];
collectOO=[];
%用训练数据训练BP神经网络
aimJ=0;
max_rate=100;
%初始化最大样本误差
trainNum=0;
%初始化训练次数
while(max_rate>
learnGoal)
collectHiddenOut=logsig(HH*input_train);
%计算隐含层输出
hiddenOut=[collectHiddenOut'
ones(361,1)]'
networkOut=OO*hiddenOut;
%计算网络输出
error=output_train-networkOut'
%计算误差
%利用目标函数,判断是否结束循环
aimJ=sumsqr(error)
if(aimJ<
break;
%统计训练次数
trainNum=trainNum+1;
%权值阈值调整因子
factor2=error'
factor1=w2'
*factor2.*collectHiddenOut.*(1-collectHiddenOut);
%调整权值和阈值调节量
dHH=factor1*input_train'
dOO=factor2*hiddenOut'
%权值阈值调整
if(trainNum<
3)
HH=HH+learnSpeed*dHH;
OO=OO+learnSpeed*dOO;
collectHH=[collectHHHH];
collectOO=[collectOOOO];
w1=HH(:
1:
inputnum);
b1=HH(:
1+inputnum);
w2=OO(:
hiddennum);
b2=OO(:
1+hiddennum);
else
%附加动量法
HH=HH+learnSpeed*dHH+0.94*(collectHH(:
((trainNum-2)*3+1):
((trainNum-2)*3+3))-collectHH(:
((trainNum-3)*3+1):
((trainNum-3)*3+3)));
OO=OO+learnSpeed*dOO+0.94*(collectOO(1,((trainNum-2)*10+1):
((trainNum-2)*10+10))-collectOO(1,((trainNum-3)*10+1):
((trainNum-3)*10+10)));
%训练数据测试,计算最大误差率
hiddenOut_test=logsig(HH*input_train);
%参数修改后的隐含层输出
network_test=w2*hiddenOut_test+repmat(b2,1,361);
%预测结果
rate=(output_train-network_test'
)./output_train;
%误差率
max_rate=max(abs(rate));
%误差率最大值
%显示测试结果
%标准函数图像y=sin(x1)+cos(x2)
[x,y]=meshgrid(-4.5:
0.1:
4.5,-4.5:
4.5);
z=sin(x)+cos(y);
figure
(1)
mesh(x,y,z)
xlabel('
x1'
);
ylabel('
x2'
zlabel('
y'
%网络图
t1=linspace(min(input(:
1)),max(input(:
1)));
t2=linspace(min(input(:
2)),max(input(:
2)));
[X,Y]=meshgrid(t1,t2);
Z=griddata(input(:
1),input(:
2),network_test'
X,Y);
figure
(2)
mesh(X,Y,Z)
Input1'
Input2'
Output'
%绘制误差曲线
t3=linspace(min(input(:
t4=linspace(min(input(:
[X1,X2]=meshgrid(t3,t4);
E=griddata(input(:
2),error,X1,X2);
figure(3)
mesh(X1,X2,E)
error'