实验二 基于BP神经网络算法的函数逼近
1、实验目的
掌握Matlab子函数的编写与调用。
理解BP神经网络算法的原理,并利用程序实现利用 BP算法逼近任意非线性函数。
2、实验内容与实验要求
掌握BP神经网络算法的原理。
掌握matlab子函数的编写方法及调用方法。
根据BP神经网络算法的原理,编写Matlab程序,逼近非线性函数。
3、实验要求
1) 自己编写Matlab函数。
2) 书写实验报告。
3) 分析实验结果,用图描述出非线性函数的真实曲线以及BP算法逼近的曲线。
4、实验设备
1) 计算机
2) Matlab软件
5、实验原理
BP神经网络算法:
神经网络由神经元和权重构成,神经元即为:输入节点,输出节点和隐层结点三部分;权重是各个神经元相互连接的强度。神经网络通过训练,从样本中学习知识,并且将知识以数值的形式存储于连接权中。神经网络的分类过程分成两部分,首先学习网络的权重,利用一些已知的数据训练网络得到该类数据模型的权重;接着根据现有的网络结构和权重等参数得到未知样本的类别。BP算法被称作反向传播算法,主要思想是从前向后(正向)逐层传播信息;从后向前(反向)逐层传播输出层的误差,间接算出隐层误差。
6、BP算法具体步骤
①前馈计算
设隐层的第j个节点的输入和输出分别为:
Ij??wij?Oi
i?1N
Oj?f(Ij) 其中f(Ij)为激励函数 f(Ij)?1
1?e?Ij
由于隐层的输出就是输出层的输入,则输出层第k个节点的总输入和输出分别为:
Ik??wjk?Oj
j?1H
yk?Ok?f(Ik) 若网络输出与实际输出存在误差,则将误差信号反向传播,并不断地修正权值,直至误差达到要求为止。
②权值调整
设误差函数定义为: 1M
Ep?2?(dk?yk)2
k?1
为了简便,以下计算都是针对每个节点而言,误差函数Ep记作E。
? 输出层权值的调整
权值修正公式为: ?wjk????E
?w jk
????E?Ik
?I
k?wjk
定义反传误差信号??E
k为:?k???I???E?Ok
?I
k?Okk
式中 ?E
?O??(dk?Ok) k
?Ok
?I??f(Ik)?f?(Ik)
k?Ik
f?(Ik)?f(Ik)[1?f(Ik)]?Ok(1?Ok) 所以 ?k?(dk?Ok)Ok(1?Ok)
H
又 ?Ik
?w??(?wjkOj)?Oj
jk?wjkj?1
由此可得输出层的任意神经元权值的修正公式:
?wjk???kOj 或 ?wjk??Ok(1?Ok)(dk?Ok)Oj (
? 隐层权值的调整 ?wij????E ?wij
?E?Ij ??? ?Ij?wij
????EOi ?Ij
?E?N
?(?wij?Oi)?Oi 式中 ?wij?wiji?1
由于误差函数E与隐层输入Ij不存在直接的函数关系,因此不能直接求得,所以 ?E?E?Oj?? ? ?Ij?Oj?Ij
??(?
M?E?Ik?f(Ij))? ?Ijk?1?Ik?OjM?E?H
)(?wjk?Oj)?f?(Ij) ??(??Ik?Ojj?1k?1
?(??kwjk)?f?(Ij)
k?1M
隐层的反传误差信号为
?i?f?(Ij)???kwjk
k?1M
由此可得,隐层权值的修正公式为; ?wij??f?(Ij)?(??kwjk)?Oi
k?1M
或 ?wij??Oj(1?Oj)?(??kwjk)?Oi
k?1M
7、程序代码
w10=[0.1 0.2;0.3 0.15;0.2 0.4]; w11=[0.2 0.1;0.25 0.2;0.3 0.35]; w20=[0.2;0.25;0.3];
w21=[0.15;0.2;0.4];
q0=[0.1 0.2 0.3];
q1=[0.2 0.15 0.25];
p0=0.2;p1=0.1;
xj=[0.5;0.9];
k1=5;k2=1200000;
yb=0;
e0=0;e1=0;e2=0;
for s=1:72
yp1=cos(2*3.14*k1*s/360);
for k=1:k2
for i=1:3
x=w11(i,1)*xj(1,:)+w11(i,2)*xj(2,:); z=x+q1(:,i);
o=[1-exp(-z)]/[1+exp(-z)];
m=1/[1+exp(-z)];
m1(i,:)=m;
o1(i,:)=o;
end
for i=1:3
yb=0;
yb=yb+w21(i,:)*o1(i,:);
end
yi=yb+p1;
n=1/[1+exp(-yi)];
y=[1-exp(-yi)]/[1+exp(-yi)];
e0=e1;
e1=e2;
e2=[(yp1-y).^2]/2;
xj1=e2-e1;
xj2=e2-2*e1+e0;
xj=[xj1;xj2];
d2=n*(1-y)*(yp1-y);
bk=d2;
for i=1:3
u=w21(i,:)*bk;
d1=[1-o1(i,:)]*u;
d0=m1(i,:)*d1;
qw=q1(:,i)-q0(:,i);
q2=q1(:,i)+0.8*d0+0.4*qw;
q3(:,i)=q2;
for j=1:2
dw=w11(i,j)-w10(i,j);
w12=w11(i,j)+0.8*d0*xj(j,:)+0.6*dw; w13(i,j)=w12;
end
end
w10=w11;
w11=w13;
q0=q1;
q1=q3;
for i=1:3
h=w21(i,:)-w20(i,:);
w22=w21(i,:)+0.4*d2*o1(i,:)+0.75*h; w23(i,:)=w22;
end
w20=w21;
w21=w23;
ph=p1-p0;
p2=p1+0.9*d2+0.6*ph;
p0=p1;
p1=p2;
if e2<0.0001,break;
else k=k+1;
end
end
e(s)=e2;
ya(s)=yp1;
yo(s)=y;
s=s+1;
end
w11=w13;
w21=w23;
s1=s-1;
s=1:s1;
plot(s,ya,s,yo,'g.',s,e,'rx');
title('BP ');
8、运行结果
9、实验结果分析
1) 此次逼近的函数为y=cosx,蓝线为真实的正弦曲线,绿色为逼近的正弦曲线,
红色代表误差曲线,从图像上可以得出逼近结果与原曲线契合程度高,效果良好。
2) 为了测试程序广泛适用性,对函数进行修改反复测试,效果良好,误差十分小。
3) BP算法能很有效的完成数据训练,是一个训练数据的好方法。
第二篇:基于BP神经网络逼近函数
用神经网络拟合一个非线性函数
姓名:李海浪 班级:10级自动化3班 学号:P101813479
1. 基于BP神经网络逼近函数
假设频率参数k=1,绘制要逼近的非线性函数的曲线。函数的曲线如图1所示.MATLAB程序如下:
k=1;
p=[0:0.05:10];
t=sin(k*pi/4*p);
plot(p,t);
title('要逼近的正弦函数');
xlabel('时间');
ylabel(正弦波函数');
图1 要逼近的正弦函数曲线
2. 建立网络
应用newff()函数建立BP网络结构。隐层神经元数目n可以改变,暂设为n=3,输出层有一个神经元。选择隐层和输出层神经元传递函数分别为tansig函数和purelin函数,网络训练的算法采用Levenberg – Marquardt算法trainlm。NATLAB程序如下:
n=3;
net = newff(minmax(p),[n,1],{'tansig' 'purelin'},'trainlm');
y1=sim(net,p);
figure;
plot(p,t,'-',p,y1,':')
title('未训练网络的输出结果');
xlabel('时间');
ylabel('仿真输出--原函数');
同时绘制网络输出曲线,并与原函数相比较,结果如图2所示。
图2 未训练网络的输出结果
“ ” 代表要逼近的非线性函数曲线;
“‥‥” 代表未经训练的函数曲线;
因为使用newff( )函数建立函数网络时,权值和阈值的初始化是随机的,所以网络输出结构很差,根本达不到函数逼近的目的,每次运行的结果也有时不同。
3.网络训练
应用train()函数对网络进行训练之前,需要预先设置网络训练参数。将训练时间设置为50,训练精度设置为0.01,其余参数使用缺省值。训练后得到的误差变化过程如图3所示。
图3 训练过程
net.trainParam.epochs=50;
net.trainParam.goal=0.01;
net=train(net,p,t);
TRAINLM-calcjx, Epoch 0/50, MSE 9.27774/0.01, Gradient 13.3122/1e-010
TRAINLM-calcjx, Epoch 3/50, MSE 0.00127047/0.01, Gradient 0.0337555/1e-010
TRAINLM, Performance goal met.
从以上结果可以看出,网络训练速度很快,经过一次循环跌送过程就达到了要求的精度0.01。
4. 网络测试
对于训练好的网络进行仿真:MATLAB程序如下:
y2=sim(net,p);
figure;
plot(p,t,'-',p,y1,':',p,y2, '--')
title('训练后网络的输出结果');
xlabel('时间');
ylabel('仿真输出');
绘制网络输出曲线,并与原始非线性函数曲线以及未训练网络的输出结果曲线相比较,比较出来的结果如图4所示。
图4 训练后网络的输出结果
“ ” 代表要逼近的非线性函数曲线;
“‥‥‥” 代表未经训练的函数曲线;
“———” 代表经过训练的函数曲线;
从图中可以看出,得到的曲线和原始的非线性函数曲线很接近。这说明经过训练后,BP网络对非线性函数的逼近效果比较好。