BP神经网络实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BP神经网络实例
智能控制
第一章BP神经网络基本原理
一、BP神经网络基本概念
1、人工神经网络
人工神经网络ANN(Artificial Neural Network),是对人类大脑系统的一阶特性的一种描述。
简单地讲,它是一个数学模型,可以用电子线路来实现,也可以用计算机程序来模拟,是人工智能研究地一种方法。
近年来发展迅速并逐渐成熟的一种人工智能技术,其来源于对神经元细胞的模拟。
人工神经网络具有以下三个特点:信息分布表示,运算全局并行与局部操作,信息非线性处理。
由于这三个特点,使得由人工神经网络构成的分类器具有强大的数据拟和与泛化能力,因而广泛运用于模式识别与机器学习领域。
神经网络模式识别的过程分为两步:首先是学习过程,通过大量的训练样本,对网络进行训练,根据某种学习规则不断对连接权值进行调节,然后使网络具有某种期望的输出,这种输出就可以将训练样本正确分类到其所属类别中去,此时可以认为网络是学习到了输入数据或样本间的内在规律。
接下来是分类过程,应用前面学习过程所训练好的权值,对任意送入网络的样本进行分类。
人工神经网络模型各种各样,目前已有数十种。
他们从各个角度对生物神经系统的不同层次进行了描述和模拟。
代表模型有感知机、多层映射BP网、RBF 网络、HoPfiled模型、Boit~机等等。
虽然人工神经网络有很多模型,但按神经元的连接方式只有两种型态:没有反馈的前向网络和相互结合型网络。
前向网络是多层映射网络,每一层中的神经元只接受来自前一层神经元的信号,因此信号的传播是单方向的。
BP网络是这类网络中最典型的例子。
在相互结合型网络中,任意两个神经元都可能有连接,因此输入信号要在网络中往返传递,从某一初态开始,经过若干变化,渐渐趋于某一稳定状态或进入周期震荡等其它状态,这方面典型的网络有Hopfiled模型等。
1
2、BP 神经网络
BP 算法是利用输出层的误差来估计输出层的直接前导层的误差,再用这个误差 估计更前一层的误差。
如此下去,就获得了所有其他各层的误差估计。
这样就形成了将输出端表现出的误差沿着与输入信号传送相反的方向逐级向网络的输入端传递的过程。
因此,人们就又将此算法称为向后传播算法,简称BP 算法。
如下图所示:
算法过程为
(1)设置各权值和阈值的初始值()[0]l ji w ,()
[0](0,1
,...,)l j l L θ=为小随机数。
(2)输入训练样本()
,q q I d ,对每个样本进行(3)~(5)步。
(3)计算各个网络层的实际输出
()()()(1)()()()l l l l l x f s f w x θ-==+
(4)计算训练误差
()()'()()()l l l j qj j j d x f s ∂=-,输出层
1
()'()(1)(1)
1
()l n l l l l j j kj k f s w +++=∂=∂∑,隐含层和输入层
(5)修正权值和阈值
(1)()()(1)()()[1][]([][1])l l l l l l ji ji j i ji ji w k w k x w k w k μη+-+=+∂+--
(1)()()()()[1][]([][1])l l l l l j j j j j k k k k θθμηθθ++=+∂+--
(6)当样本集中的所有样本都经历了(3)~(5)步后,即完成了 一个训练周期
(Epoch ),计算性能指标1
E=E Q
q q =∑,其中()211E 2m q qj qj j d x ==-∑。
(7)如果性能指标满足精度要求,即E ε≤,那么训练结束,否则,转到(2),继
续下一个训练周期。
ε是小的正数,根据实际情况而定,例如0.01
3、流程图
根据BP 网络的算法,我们可得流程图如下。
第二章 BP 神经网络实例分析
一、实例要求
1、1()cos(),(0,2)f x x x π=∈
取九个点来训练网络,然后得出拟合曲线。
2、2()sin(),(0,2)f x x x π=∈
取适当数量训练点来训练网络,然后得出拟合曲线
3、()3sin sin ,;,(10,10)x y
f x y x y x y
=
⋅∈- 取11*11个点来训练网络,并用21*21个点测试拟合的曲面。
二、计算结果如下
1、第一个函数:1()cos(),(0,2)f x x x π=∈
(2)学习率为0.2,训练次数为3300时
训练过程如学习曲线所示,圈圈为学习后产生的,折线为标准函数点连线。
检验过程如检验
曲线所示,点序列为拟合曲线上的点,曲线为标准函数曲线。
误差曲线如右图所示。
(2)学习率为0.01,训练次数为3300时的曲线。
从函数1可以看出,学习率比较大时,曲线收敛比较快,可以比较快速达到精度要求。
但实际上,学习率
比较大时(即收敛步长比较大),容易超出收敛边界,反而收敛导致不稳定,甚至发散。
2、第二个函数:2()sin(),(0,2)f x x x π=∈
(1)学习率为0.2,样本点数为10,学习次数为5000时的曲线如下:
(2)学习率为0.2,样本点数为30,学习次数为5000时的曲线如下:
从函数2可以看出,样本点个数越多时,曲线精度越高。
但学习时间会有所增加。
3、第三个函数()3sin sin ,;,(10,10)x y
f x y x y x y
=
⋅∈- 学习率为0.1,动量项学习率为0.05,训练次数为5000,训练样本数为11*11。
图形如下:
附:程序源代码
第一个和第二个函数的程序:
%此BP网络为两层隐含层,每个隐含层4个节点。
输入输出各一层
%输入层和输出层均采用恒等函数,隐含层采用S形函数
clear all;
close all;
b=0.01; %精度要求
a=0.2; %学习率
c=2;
Num=30; %训练样本数
N=3300; %训练次数
Nj=80; %检验样本数
o0=rand(2,1); %输入层阈值
o1=rand(4,1); %第一层隐含层阈值
o2=rand(4,1); %第二层隐含层阈值
o3=rand(1,1); %输出层阈值
w1=rand(4,2); %输入信号为两个
w2=rand(4,4); %第一层隐含层与第二层隐含层的权系数w3=rand(1,4); %第二层隐含层与输出层的权系数
syms x y; %符号变量,用于两个输入值
%fcn=cos(x); %被学习的函数
fcn=abs(sin(x));
x0=0:2*pi/(Num-1):2*pi; %输入的训练样本
y0=0:2*pi/(Num-1):2*pi;
x=x0;
y=y0;
X(1,:)=x0;
X(2,:)=y0;
yf=eval(fcn); %输出的训练样本
x3=zeros(1,Num);
time=0;
for j=1:1:N
for i=1:1:Num
%前向计算:
s1=w1*X(:,i)-o1;
x1=1./(1+exp(-s1)); %第一层隐含层输出
s2=w2*x1-o2;
x2=1./(1+exp(-s2)); %第二层隐含层输出
s3=w3*x2-o3;
%x3=1./(1+exp(-s3)); %输出层输出
x3(i)=s3;
%反向计算:
%e3=(yf(i)-x3)./(exp(s3)+2+exp(-s3)); %输出层误差
e3=yf(i)-x3(i);
e2=((w3)'*e3)./(exp(s2)+2+exp(-s2)); %第二层隐含层误差 e1=((w2)'*e2)./(exp(s1)+2+exp(-s1)); %第一层隐含层误差%权值和阈值修正
w3=w3+a*e3*(x2)'; %权值修正
w2=w2+a*e2*(x1)';
w1=w1+a*e1*(X(:,i))';
o3=o3-a*e3; %阈值修正
o2=o2-a*e2;
o1=o1-a*e1;
end
E(j)=0.5*((yf-x3)*(yf-x3)'); %方差
time=time+1; %记录学习次数
if E(j)<b
break
end
%检验
m=0:2*pi/(Nj-1):2*pi;
n=0:2*pi/(Nj-1):2*pi;
x=m;
y=n;
ym=eval(fcn); %期望输出
M(1,:)=x;
M(2,:)=y;
m3=zeros(1,Nj);
for i=1:1:Nj
S1=w1*M(:,i)-o1;
m1=1./(1+exp(-S1)); %第一层隐含层输出
S2=w2*m1-o2;
m2=1./(1+exp(-S2)); %第二层隐含层输出
S3=w3*m2-o3;
%m3(i)=1./(1+exp(-S3)); %输出层输出
m3(i)=S3;
end
figure(1);plot(m,ym,'g-');
hold on
plot(m,m3,'r.'); title('检验曲线');
xlabel('x');
ylabel('y=cos(x) ');
figure(2);plot(x0,yf,'b-');
hold on
plot(x0,x3,'ro'); title('学习曲线');
xlabel('x');
ylabel('y=cos(x)');
k=1:time;
figure(3);plot(k,E); title('误差曲线');
xlabel('训练次数');
ylabel('误差值');
第三个函数的程序
%此BP网络为两层隐含层,每个隐含层10个节点。
输入输出各一层%输入层和输出层均采用恒等函数,隐含层采用S形函数
close all;
b=0.05; %精度要求
a=0.1; %学习率
c=0.05; %动量项学习率
Num=11; %训练样本数
N=5000; %训练次数
Nj=21; %检验样本数
o0=rand(2,1); %输入层阈值
o1=rand(10,1); %第一层隐含层阈值
o2=rand(10,1); %第二层隐含层阈值
o3=rand(1,1); %输出层阈值
w1=rand(10,2); %输入层与第一层隐含层的权系数
w2=rand(10,10); %第一层隐含层与第二层隐含层的权系数w3=rand(1,10); %第二层隐含层与输出层的权系数
o1_before=zeros(4,1); %用于存储前一次的阈值
o2_before=zeros(4,1);
o3_before=zeros(1,1);
w1_before=zeros(4,2); %用于存储前一次的权值
w2_before=zeros(4,4);
w3_before=zeros(1,4);
o1_next=zeros(4,1); %用于存储后一次的阈值
o2_next=zeros(4,1);
o3_next=zeros(1,1);
w1_next=zeros(4,2); %用于存储后一次的权值
w2_next=zeros(4,4);
w3_next=zeros(1,4);
[x0,y0]=meshgrid(-10:20/(Num-1)-0.001:10); %输入的训练样本
yf=(sin(x0).*sin(y0))./(x0.*y0); %被学习的函数
x3=zeros(Num,Num);
time=0;
E=zeros(1,N);
for j=1:1:N
for i=1:1:Num
for h=1:1:Num
X=zeros(2,1);
X(1,:)=x0(i,h);
X(2,:)=y0(i,h);
%前向计算:
s1=w1*X-o1;
x1=1./(1+exp(-s1)); %第一层隐含层输出
s2=w2*x1-o2;
x2=1./(1+exp(-s2)); %第二层隐含层输出
s3=w3*x2-o3;
%x3=1./(1+exp(-s3)); %输出层输出
x3(i,h)=s3;
%反向计算:
%e3=(yf(i)-x3)./(exp(s3)+2+exp(-s3)); %输出层误差
e3=yf(i)-x3(i);
e2=((w3)'*e3)./(exp(s2)+2+exp(-s2)); %第二层隐含层误差 e1=((w2)'*e2)./(exp(s1)+2+exp(-s1)); %第一层隐含层误差 w3_next=w3+a*e3*(x2)'+c*(w3-w3_before); %权值修正
w2_next=w2+a*e2*(x1)'+c*(w2-w2_before);
w1_next=w1+a*e1*X'+c*(w1-w1_before);
o3_next=o3-a*e3+c*(o3-o3_before); %阈值修正
o2_next=o2-a*e2+c*(o2-o2_before);
o1_next=o1-a*e1+c*(o1-o1_before);
w1_before=w1;w2_before=w2;w3_before=w3;
o1_before=o1;o2_before=o2;o3_before=o3;
w1=w1_next;w2=w2_next;w3=w3_next;
o1=o1_next;o2=o2_next;o3=o3_next;
d=yf(i,h);
y=x3(i,h);
E(j)=E(j)+0.5*((d-y)^2); %方差
end
end
time=time+1; %记录学习次数
if E(j)<b
break
end
end
%检验
[m,n]=meshgrid(-10:(20/(Nj-1)-0.001):10);
ym=(sin(m).*sin(n))./(m.*n);
m3=zeros(Nj,Nj);
for i=1:1:Nj
for j=1:1:Nj
M=zeros(2,1);
M(1,:)=m(i,j);
M(2,:)=n(i,j);
S1=w1*M-o1;
m1=1./(1+exp(-S1)); %第一层隐含层输出
S2=w2*m1-o2;
m2=1./(1+exp(-S2)); %第二层隐含层输出
S3=w3*m2-o3;
m3(i,j)=S3; %输出层输出
end
end
figure(1);surf(x0,y0,yf);title('学习期望输出');grid on;
figure(2);surf(x0,y0,x3);title('学习实际输出');grid on;
figure(3);subplot(221);surf(m,n,ym);title('检验期望输出');grid on; subplot(222);surf(m,n,m3);title('检验实际输出');grid on;
k=1:time;
subplot(212);title('误差曲线');plot(k,E);。