BP神经网络逼近非线性函数

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

应用BP 神经网络逼近非线性函
一、实验要求
1、逼近的非线性函数选取为y=sin(x 1)+cos(x 2) ,其中有两个自变量即x1,x2,一个因变量即y。

2、逼近误差<5% ,即:应用测试数据对网络进行测试时,神经网络的输出与期望值的最大误差的绝对值小于期望值的5% 。

3、学习方法为经典的BP 算法或改进形式的BP 算法,鼓励采用改进形式的BP 算法。

4、不允许采用matlab 中现有的关于神经网络建立、学习、仿真的任何函数及命令。

二、实验基本原理
2.1神经网络概述
BP 神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传播,误差反向传播。

在前向传递中,输入信号从输入层经隐含层逐层处理,直至输出层。

每一层的神经元
状态只影响下一层神经元状态。

如果输出层得不到期望输出,则转入反向传播,根据预判误差调整网络权值和阈值,从而使BP 神经网络预测输出不断逼近期望输出。

BP 神经网络的拓扑结构如图所示。

2.2BP 神经网络训练步骤
BP 神经网络预测前首先要训练网络,通过训练使网络具有联想记忆和预测能力。

BP 神经网络的训练过程包括以下几个步骤。

步骤 1 :网络初始化。

根据系统输入输出序列(X,Y) 确定网络输入层节点数
n 、隐含层节点数l、输出层节点数m ,初始化输入层、隐含层和输出层神经元之间的连接权值ωij,
ωjk ,
初始化隐含层阈值a,输出层阈值 b ,给定学习速率和神经元激励函数。

步骤 2 :隐含层输出计算。

根据输入变量X,输入层和隐含层间连接权值ω ij 以及隐含层阈值a,计算隐含层输出H 。

2.3 附加动量法
经典 BP 神经网络采用梯度修正法作为权值和阈值的学习算法, 从网络预测误差的负梯 度方向修正权值和阈值, 没有考虑以前经验的积累,学习过程收敛缓慢。

对于这个问题,可 以采用附加动量法来解决,带附加动量的算法学习公式为
(k) (k 1) (k) a (k 1) (k 2)
式中,ω (k),ω(k-1) ,ω(k-2)分别为 k ,k-1,k-2 时刻的权值; a 为动量学习率,一般取值 为 0.95 。

H j
n
f(
i1
ij x i a j
)
j=1,2 ,⋯, l
式中,l 为隐含层节点数, f 为隐含层激励函数,
该函数有多种形式, 一般选取为 f(x) 1
x
1e
步骤 3 : 输出层输出计算。

根据隐含层输出
H ,连接权值ω jk 和阈值 b ,计算 BP 神经 网络预测输出 O 。

l
O k
H j
j1
jk
b
k
k=1,2 ,⋯, m
步骤 4:
误差计算。

根据网络预测输出 和期望输出 Y ,计算网络预测误差 e 。

e
k
Y
k
O
k
k=1,2 ,⋯, m
步骤 5:
权值更新。

根据网络预测误差 e 更新网络连接权值ω ij ,ω jk ij ij
H j (1 H j )x(i) jk e k
i=1,2, ⋯,n j=1,2,
⋯,l
jk jk
H j e k
j=1,2, ⋯,l k=1,2, ⋯,m
步骤 6:
阈值更新。

根据网络预测误差 e 更新网络节点阈值 a ,b 。

步骤 7:
a j a j H j (1
m
H
j )
jk e k
k1
j=1,2, ⋯,l
b k b k e k
k=1,2, ⋯,m
判断算法迭代是否结束,若没有结束,返回步骤 2。

三、程序简述
本次实验选择逼近的非线性函数为y=sin(x 1)+cos(x 2)。

程序首先创建用于神将
网路训
2.4 程序流程图
练的样本数据,取在区间[-4.5,4.5] 之间均匀分布的数值,由于有两个自变量,所以一共产生361 组输入输出数据。

其次确定神经网络的训练参数,比如隐含层节点
数、学习速率、学习目标、隐含层和输出层的权值阈值等,其中隐含层节点数在参考相关资料后确定为这样不仅在训练结束后可以获得较小的误差,而且也不会使训练
次数过大从而耗时较长;序中隐含层和输出层的权值阈值是采取随机产生的方法获得的,并且之后的修改方法采用了附加动量法,减少训练次数加快网络收敛。

由于matlab 可以采用矩阵运算的形式,所以输入输出数据和网络权值阈值构建生成相应
的矩阵,这样可以在全部数据遍历一次之后再进行
9,

权值阈值修改,同样可以缩短网络训练时间。

最后,根据修正后的权值阈值就输入数据预测网路输出,和期望输出数据进行比较,计算输出误差,直至训练结束根据训练结果画出相应图像。

最初程序中神经网络训练只有当最大预测误差小于5% 之后才停止,实际情况中,当输出接近0 时只要有微小的变化就会产生较大的误差,这样不仅导致网络训练次数增加耗时长,还会使网络收敛速度变慢;在经过查询相关资料之后,训练结束条件除了最大预测误差小于5% 之外,还增加了目标函数,目标函数是取所有误差的平方和,当目标函数的计算值小于预期目标时同样也会停止训练,此时默认训练已达目标。

在实际检验过程中发现,加入目标函数后不仅可以有效地改善收敛速度慢耗时长的问题,同时各个坐标点的预测误差也在期望值之内,达到了实验要求。

四、实验结果
由于程序中权值阈值的取值是随机的,所以取其中一次的结果展示。

最大训练次数为
15329 ,训练结束后的最大误差为 2.5331 。

图 1 非线性函数
图 2 网络图
图 3 误差曲线
程序:
clc
clear
% 创建输入数据,产生361 组输入输出数据row = 1; for i=-4.5:0.5:4.5
for j=-4.5:0.5: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 = [input ones(361,1)]'; output_train = output;
HH = [w1 b1];
OO = [w2 b2];
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<learnGoal) break; end
%统计训练次数 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 = [collectHH HH]; collectOO = [collectOO OO]; w1 = HH(:,1:inputnum); b1 = HH(:,1+inputnum); w2 = OO(:,1: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,((train Num-3)*10+1):((trainNum-
3)*10+10)));
collectHH = [collectHH HH];
collectOO = [collectOO OO];
w1 = HH(:,1:inputnum);
b1 = HH(:,1+inputnum);
w2 = OO(:,1:hiddennum);
b2 = OO(:,1+hiddennum);
end
%训练数据测试,计算最大误差率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)); %误差率最大值end
%显示测试结果
% 标准函数图像y=sin(x1)+cos(x2)
[x,y] = meshgrid(-4.5:0.1:4.5,-4.5:0.1: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) xlabel('Input1');
ylabel('Input2'); zlabel('Output'); %绘制误差曲线t3=linspace(min(input(:,1)),max(input(:,1)));
t4=linspace(min(input(:,2)),max(input(:,2)));
[X1,X2]=meshgrid(t3,t4);
E=griddata(input(:,1),input(:,2),error,X1,X2); figure(3) mesh(X1,X2,E) xlabel('Input1');
ylabel('Input2'); zlabel('error');。

相关文档
最新文档