2024国赛数学建模预测算法-BP神经网络模型的预测精度分析(MATLAB 实现)
人工神经网络
第一节 人工神经网络概述
在您阅读这本书的时候,大约有个相互连接的神经元在帮助您阅读、呼吸、思考,以及完成各种各样的动作。这些神经元中,有些有着与生俱来的功能,比如呼吸、吮吸,有些则是由后天训练得到的,比如阅读、语言。虽然人们并不完全清楚生物的神经网络是如何工作的,但是根据神经元的基本工作原理而构造的“人工神经元”,可以模拟“人脑”的某些功能,这就是本部分所要讨论的内容。
人工神经网络(Artificial Neural Network,ANN)是在人类对大脑神经网络认识理解的基础上人工构造的能够实现某种功能的神经网络。它是理论化的人脑神经网络的数学模型,是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统。它实际上是由大量简单元件相互连接而成的复杂网络,具有高度的非线性,是能够进行复杂的逻辑操作和非线性关系实现的系统。人工神经网络吸取了生物神经网络的许多优点,因而有其固有的特点,包括:
(1)高度的并行性;
(2)高度的非线性全局作用;
(3)良好的容错性与联想记忆功能;
(4)十分强的自适应、自学习功能。
人脑神经系统的基本构造单元是神经元,它与人体中其它细胞的关键区别在于具有产生、处理和传递信号的功能。每个神经元都包括三个主要部分:细胞体、树突和轴突。树突的作用是向四方收集由其他神经元传来的信息,轴突的功能是传出从细胞体送来的信息。每个神经元所产生和传递的基本信息是兴奋或抑制。在两个神经元之间的相互接触点称为突触。简单神经元模型如图8-1所示。
图8-1 简单神经元模型
从信息的传递过程来看,一个神经元的树突,在突触处从其他神经元接受信号。这些信号可能是兴奋的,也可能是抑制的。所有树突接受到的信号都传到细胞体进行综合处理。如果在一个时间间隔内,某一细胞接受到的兴奋信号量足够大,以至于使该细胞被激活,而产生一个脉冲信号。这个信号将沿着该细胞的轴突传送出去,并通过突触传给其他神经元。神经元通过突触的联接形成神经网络。
人们正是通过对人脑神经系统的初步认识,尝试构造出人工神经元以组成人工神经网络系统,来对人的智能,甚至是思维行为进行研究,尝试从理性角度阐明大脑的高级机能。人工神经元仿效生物神经元最基本的特征,与生物原形相对应,其主要结构单元是信号的输入、综合处理和输出,其输出信号的强度大小反映了该单元对相邻单元影响的强弱。人工神经元之间通过相互联接形成网络,称为人工神经网络。神经元之间相互连接的方式成为连接模式,相互之间的连接度由连接权值体现。在人工神经网络中,改变信息处理过程及其能力的过程,就是修改网络权值的过程。目前多数人工神经网络的构造都采用以下原则:
(1)由一定数量的基本单元分层连接构成;
(2)每个单元的输入、输出信号以及综合处理内容都比较简单;
(3)网络的学习和知识的存储体现在各单元之间的联接强度上。
随着人工神经网络技术的发展,其用途日益广泛,应用领域也在不断扩展,已在各工程领域中得到广泛应用。人工神经网络技术可用于如下信息处理工作:函数逼近、感知觉模拟、多目标跟踪、联想记忆及数据恢复等。具体而言,主要用于解决下述几类问题:
(1)模式信息处理和模式识别。神经网络经过训练可有效地提取信号、语音、图像、雷达、声纳等感知模式的特征,并能解决现有启发式模式识别系统不能很好解决的不变测量、自适应、抽象或概括等问题。神经网络可以应用于模式识别的各个环节,如特征提取、聚类分析、边缘检测、信号增强、噪声抑制、数据压缩等。模式识别是人工神经网络特别适宜求解的一类问题,神经网络模式识别技术在各领域中的广泛应用是神经网络技术发展的一个重要侧面。
(2)人工智能。专家系统是人工智能领域研究时间最长,应用最成功的技术,但人们在应用专家系统解决诸如语音识别、图像处理和机器人控制等这类类似于人脑的形象思维的问题时,却遇到很大困难。神经网络为人工智能开辟了一条暂新的途径,成为人工智能研究领域中的后起之秀。
(3)控制工程。神经网络在诸如机器人运动控制、工业声场中的过程控制等复杂控制问题方面有独到之处。较之基于传统数字计算机的离散控制方式,神经网络更适于组成快速实时自适应控制系统。
(4)联想记忆。联想记忆的作用是用一个不完整或模糊的信息联想出储存在记忆中的某个完整、清晰的模式来。如何提高模式存贮量和联想质量仍是神经网络的热点之一。目前在这方面的应用有内容寻址器、人脸识别器、知识数据库等。
(5)信号处理。神经网络的自学习和自适应能力使其成为对各类信号进行多用途加工处理的一种天然工具,主要用于解决信号处理中的自适应和非线性问题。包括自适应均衡、自适应滤波、回波抵消、自适应波束形成和各种非线性问题。
虽然神经网络在许多领域都有成功的应用案例,但神经网络也不是尽善尽美的。目前,神经网络的理论研究和实际应用都会在进一步的探索之中,相信随着人工神经网络研究的进一步深入,其应用领域会更广,用途会更大。
第二节 人工神经网络的基本结构与模型
一个人工神经网络的神经元模型和结构描述了一个网络如何将他的输入矢量转化为输出矢量的过程。这个转化过程从数学的角度来看就是一个计算过程。也就是说,人工神经网络的实质体现了网络输入和输出之间的函数关系。通过选取不同的模型结构和激活函数,可以形成各种不同的人工神经网络,达到不同的设计目的。
一、人工神经元的模型
神经元是人工神经网络的基本处理单元,它一般是一个多输入、单输出的非线性元件。神经元输出除受信号影响外,同时也受到神经元内部其他因素的影响,所以在人工神经元的建模中,常常还加有一个额外的输入信号,成为偏差(bais),有时也称为阈值或门限值。
一个具有个输入分量的神经元如图8-2所示。其中,输入分量()通过与和它相乘的权值分量()相连,以的形式形成激活函数的输入。激活函数的另一个输入是神经元的偏差。
图8-2单个神经元模型
w权值和输入p的矩阵形式可以由行向量w和列向量p来表示:
神经元的输入向量可以表示为:
可以看出偏差被简单的加在上作为激活函数的另一个输入分量。实际上偏差也是一种权值,只是它的输入为恒为1,这就保证了输入与权值的乘积仍为。在网络设计中,偏差起着重要的作用,它使得激活函数的图形可以左右移动而增加了解决问题的可能性。
二、激活转移函数
激活函数(Activation transfer function)是一个神经元及网络的核心。网络解决问题的能力与功效除了与网络结构有关,在很大程度上取决于网络所采用的激活函数。激活函数的基本作用是:
(1)控制输入对输出的激活作用;
(2)对输入、输出进行函数转换;
(3)将可能无线域的输入变换成制定的有限范围内的输出。
下面是几种常用的激活函数:
(1)阈值型
这种激活函数将任意输入转化为0或1输出,函数为单位越阶函数,具有此函数的神经元的输入输出关系为:
(2)线性型
线性激活函数使网络的输入输出等于加权输入和加上偏差,此函数的输入输出关系为:
(3)型
型激活函数将任意输入值压缩到的范围内,此种激活函数常用对数或双曲正切等一类形状的曲线来表示,如对数型激活函数关系为:
双曲正切型曲线的输入输出函数关系为:
型激活函数具有非线性放大增益,对任意输入的增益等于在输入输出曲线中该输入点处的曲线斜率值。利用该函数可以使同一神经网络既能处理小信号,又能处理大信号。如果网络神经元中所具有的激活函数是线性的,则称这个神经网络是线性的,反之则称之为非线性的。
三、单层与多层神经网络模型结构
将两个或更多的简单的神经元并联起来,使每个神经元具有相同的输入矢量,即可组成一个神经元层,其中每一个神经元产生一个输出,图8-3给出了一个具有个输入分量, 个神经元组成的单层神经元网络。
图8-3单层神经网络模型结构
从结构图中可以看出,输入矢量P的每个元素,通过权矩阵w与每个输出神经元相连,每个神经元通过一个求和符号,再与输入矢量进行加权求和运算,形成激活函数的输入矢量,并经过激活函数f作用后得到输出矢量A,它可以表示为:
其中s为神经元个数,上式字母的下标给出了矢量矩阵的维数。一般情况下,输入分量数目r与神经元数目s不一定相等。网络权矩阵为:
其中行表示神经元的个数,列表示是入矢量的维数,例如表示第二个输入的数值到第一个神经元之间的连接权值。
将两个以上的单层神经网络连接起来,就组成了多层神经网络。一个人工神经网络可以有许多层,每层都有一个权矩阵,一个偏差矢量和一个输出矢量,一般称第一层的权矩阵和输出矢量为和,第二层的权矩阵和输出矢量为和,以此类推。以三层神经网络为例,其简化的网络结构见图8-4,第一层的输出结果为第二层的输入矢量,第二层的输出结果又为第三层的输入矢量,第三层则输出最终的结果。一般情况下,不同层有不同的神经元个数,每个神经元都带有一个输入为常数1的偏差值。多层神经网络的每一层起着不同的作用,最后一层为网络的输出,称为输出层,所有其它层称为隐含层,因此一个三层的神经网络是包含两个隐含层和一个输出层的。
图8-4 三层神经网络结构图
第三节 线性神经网络
自适应线性神经元ADALINE(ADAptive LInear NEuron)是在1960年由斯坦福大学教授B.Widrow和M.Hoff提出的,它是线性神经网络最早的典型代表,其学习算法称之为LMS(least mean squares)算法或W-H(Widrow-Hoff)学习规则。
一、线性神经网络模型及学习规则
线性神经网络模型如图8-4所示。
图8-4线性神经网络层模型
线性神经元的传输函数为线性函数,线性神经网络层的输出为
线性神经网络层的输出可以取任意值,而且可以是多层的,但是只能求解线性问题,而不能用于非线性计算。自适应线性神经元是一个自适应可调的网络,适用于信号处理中的自适应滤波、预测和模式识别。
对线性神经网络可以不经过训练直接求出网络的权值和阈值,如果网络由多个零误差解,则取最小的一组权值和阈值;如果网络不存在零误差解,则取网络的误差平方和最小的一组权值和阈值。因为线性系统有唯一的误差最小值,在这种情况下,根据给定的一组输入向量和目标向量,可以计算出实际输入向量和目标向量的误差最小值。
另外,当不能直接求出网络权值和阈值时,线性神经网络及自适应线性神经网络可采用使均方误差最小的学习规则,即LSM算法,或称之为W-H学习规则来调整网络的权值和阈值,它是一种沿误差的最陡下降方向对前一步权值向量进行修整的方法。
对于r个训练样本
W-H学习规则的基本思想是要寻找最佳的,,使各设神经元输出的均方误差最小。神经元的均方误差为
上式中:r——训练样本数;
a——神经元输出的实际值;
t——神经元输出的期望值。
为了寻找最佳的W,b,使每个神经元输出的均方误差最小,以x代表W或b,求对的偏导:
令上式等于0即可求出的极值点。当然,极值点可以是极大值,也可以是极小值,但只能是正值,即mse-xj曲面一定是凹向上的,所以极值点必为极小值。采用搜索优化法,假设获得第次训练得到权值或阈值,然后找出曲面上在该点的最陡下降方向,再沿此方向对权值进行修正。
式中是决定权值和阈值收敛速度和稳定性的参数,称之为学习速率。学习速率越大,学习的速度越快,但过大的学习速率会使修正过渡,造成不稳定,反而使误差更大。
线性神经网络的LSM学习规则是建立在均方误差最小化基础上的,其学习过程表现为曲面上的梯度下降。同时,由于误差与权值构成的抛物面只有一个极小值点,因此LSM算法可以保证误差函数最小,但这需要无限次的学习,所以实际应用中有限次的学习结果只能得到近似解。
二、线性神经网络的Matlab仿真程序设计
从神经网络的程序设计来说,线性神经网络的Matlab仿真程序设计主要包括以下几个方面:
(1)以命令newlin创建线性神经网络。首先根据所要解决的问题确定输入向量的取值范围和维数、网络层的神经元数目等;然后以线性神经网络的创建函数newlin创建网络。
(2)以命令train训练网络,或以adapt自适应调整权值和阈值。构造训练样本集,确定每个样本的输入向量和目标向量,调用函数train对网络进行训练,或以adapt自适应调整权值和阈值,并根据训练的情况,决定是否调整训练参数,以得到满足误差性能指标的神经网络。
(3)用sim对训练后的网络进行仿真,如果所要解决的问题需要得到网络的仿真结果,则需要构造测试样本集,加载训练后的网络,调用函数sim,以得到网络的仿真结果。
线性神经网络的指令格式为:
(1)net=newlind(P,T)
其中:P——输入向量;
T——目标输出向量。
(2)net=newlin(PR,S,ID,LR)
其中:PR——R个输入向量的取值范围;
S——神经元个数;
ID——深入延迟向量,缺省值为0;
LR——学习速率,缺省值为0.01。
例8.2 以单层线性网络模拟函数,函数真值表见表8-1。
表8-1 函数真值表
输入 | 输入 | 输出 |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
若把函数p1-p2看成平面上的点,则点(0,0),(1,0),(0,1)表示输出为0的点,而点(1,1)表示输出为1的点。可以看出,这是一个简单的线性划分的问题,用一个线性神经元的网络就可以实现,程序代码如下:
function exp82; clear all; p=[0 1 0 1;0 0 1 1] t=[0 0 0 1] net=newlind(p,t); w=net.IW{1} b=net.b{1} a=sim(net,p) y=a>0.5 | %给m文件命名为ep82 %清除所有内存变量 %输入向量 %输出向量 %设计线性神经网络 %输出训练后的权值 %输出训练后的阈值 %输出仿真结果 %将仿真结果转化为整数值 |
其输出结果如下:
w = 0.5000 0.5000
b = -0.2500
a = -0.2500 0.2500 0.2500 0.7500
y = 0 0 0 1
结果中的a是将输入p带入已经训练好的线性神经网络后,计算出的结果,y是取整后的数值。
线性神经网络还可以实现噪声对消,下面的例子利用加入噪声的正弦函数来检验线性神经网络的噪声对消功能。
例8.3 设计线性神经网络,实现对正弦函数的噪声对消。
解:输入向量为正弦波信号与随机噪声之和,输出信号为网络调整过程中的误差信号。程序代码如下:
function exp83 clear all; time=0.01:0.01:10; noise=(rand(1,1000)-0.5)*4; input=sin(time); p=noise; t=input+noise; net=newlin([-1,1],1,0,0.0005); net.adaptParam.passes=70; [net,y,output]=adapt(net,p,t); hold on subplot(3,1,1); plot(time,input,'b'); xlabel('t','position',[10.5,-1]); ylabel('信号波形sin(t)','fontsize',8); subplot(3,1,2); plot(time,t,'m'); xlabel('t','position',[10.5,-5]); ylabel('随机噪声波形sin(t)+noise(t)','fontsize',8); subplot(3,1,3); plot(time,output,'r'); xlabel('t','position',[10.5,-2]); ylabel('输出信号波形y(t)','fontsize',8); hold off | %给m文件命名为ep83 %清除所有内存变量 %输入自变量time的取值 %设置噪声值 %对自变量取正弦函数值 %输入因变量t的取值 %创建神经网络 %设置网络自适应函数 %绘制图像 |
其结果如图8-5
图8-5运行结果
另外,在程序设计中,需要注意学习率和训练步长的选择,学习率过大,学习的过程将不稳定,而且误差会更大;学习率过小,学习的过程将变慢,需要的训练步长数将加大。
第四节 BP神经网络
线性神经网络的LMS学习算法只能训练单层神经网络,而单层神经网络只能解决线性可分的分类问题。多层神经网络可以用于非线性分类问题,但需要寻找训练多层神经网络的学习算法。
1974年P.Werbos提出了一个适合多层网络的学习算法,1986年美国加州的PDP小组将该算法用于神经网络的研究,才使之成为迄今为止最著名的多层网络学习算法——BP算法,由此算法训练的神经网络,称之为BP神经网络。在人工神经网络的实际应用中,BP网络广泛应用于函数逼近、模式识别、数据压缩等。
一、BP神经网络模型
BP神经元与其它神经元的不同之处是BP神经元的传输函数为非线性函数,最常用的函数是logsig和tansig函数,有的输出层也采用线性函数purelin。其输出为
BP神经网络一般为多层神经网络。由BP神经元构成的二层神经网络如图8-?所示。BP网络的信息从输入层流向输出层,因此是一种多层前馈神经网络。如果多层BP网络的输出层采用形传输函数,其输出值将会限制在一个较小的范围内,而采用线性传输函数则可以取任意值。
在确定BP网络的结构后,要通过输入和输出样本集对网络进行训练,亦即对网络的阈值和权值进行学习和修正,以使网络实现给定的输入输出映射关系。BP神经网络的学习过程分为两个阶段:
第一阶段是输入已知学习样本,通过设置的网络结果和前一次迭代的权值和阈值,从网络的第一层向后计算出各神经元的输出。
第二阶段是对权值和阈值进行修改,从最后一层向前计算各权值和阈值对总误差的影响,据此对各权值和阈值进行修改。
以上两个过程反复交替,直到达到收敛为止。由于误差逐层往回传递,以修正层与层间的权值和阈值,所以称该算法为误差反向传播算法。标准的BP算法和W-H学习规则一样是一种梯度下降学习算法,其权值的修正是沿着误差性能函数梯度的反方向进行的。针对标准BP算法出现了几种给予标准BP算法的改进算法,如变梯度算法、牛顿算法等。BP神经网络的主要改进算法见表8-2
表8-2 BP神经网络主要改进算法
算法 | 函数 |
最速下降BP算法 | traingd |
动量BP算法 | traingdm |
学习率可变BP算法 | traingda/traingdx |
弹性BP算法 | trainrp |
变梯度算法F-R修正函数 | traincgf |
变梯度算法P-R修正函数 | traincgp |
变梯度算法P-B修正函数 | traincgb |
变梯度SCG算法 | trainscg |
黄金分割搜索 | srchgol |
Brent搜索 | srchbre |
对分-三次插值混合搜索 | srchhyb |
Charalambous搜索 | srchcha |
反向跟踪搜索 | srchbac |
拟牛顿BFGS算法 | trainbfg |
拟牛顿OSS算法 | trainoss |
LM算法 | trainlm |
对于一个给定的问题,到底采用哪种训练方法,其训练速度是最快,这是很难预知的,因为这取决于许多因素,包括给定问题的复杂性、训练样本集的数量、网络权值和阈值的数量、误差目标、网络的用途等。BP神经网络的指令格式为:
net=newff
net=newff(PR,[S1 S2 … SN],{Tf1 Tf2 …TfN},BTF,BLF,PF)
其中:PR——输入向量的取值范围;
Si——第i层神经元个数,总共N层;
Tfi——第i层的传递函数,缺省值为tansig;
BTF——BP网络训练函数,缺省值为trainlm;
BLF——BP网络权值和阈值学习函数,缺省值为learngdm;
PF——性能函数,缺省值为mse。
二、BP神经网络的Matlab仿真程序设计
例8.4 建立一个两层的BP神经网络,输入范围是,网络第一层采用正切函数,第二层采用线性神经元,样本输入和目标输出为:
解:创建BP神经网络程序代码如下:
function exp84; clear all; p=[0 1 2 3 4 5 6 7 8 9 10]; t=[0 1 2 3 4 3 2 1 2 3 4]; net=newff([0 10],[5 1],{'tansig' 'purelin'}); net.trainParam.epochs=50; net=train(net,p,t); y=sim(net,p); plot(p,t,p,y,'o') | %设定输入向量 %设定目标输出 %创建网络,输入范围是[0 10],两层神经元个数为[5 1] %训练次数 %训练神经网络 %对训练好的网络进行拟和,拟和结果为y %绘制图像 |
训练后得到的拟和结果见图8-6。
图8-6 BP神经网络训练结果比较
在BP神经网络的训练中往往会出现这样的情况,当网络的训练误差很小的时候,一个新的输入会使网络的训练误差迅速增大。这是因为网络记忆了已被训练的样本,而对新的输入没有良好的泛化能力,也就是说网络对新输入的计算结果与真实值有较大的误差。提高网络泛化能力的一个办法就是适当的增大网络的规模,但是对于一个具体的问题,要事先就很好的确定网络的规模是很困难的。而在Matlab神经网络工具箱中,提供了提高网络的泛化能力的方法——规则化调整(Regularization).
规则化调整方法是通过调整网络的性能函数来增强网络泛化能力。普通的BP神经网络都采用网络误差的均方根之和作为性能函数:
其中
分别表示第个训练样本的训练误差、目标输出和网络输出。而调整后的网络性能函数为:
其中
为性能函数,。
使用该性能函数可以减少网络的有效权值和阈值,并且使网络的训练输出更加平滑,从而增强网络的泛化能力。在Matlab工具箱中,提供了自动设置最优性能参数的
函数trainbr,该函数假设网络的权值和阈值是特殊分布的随机变量,然后用统计学方法估计出了
值。
例8.5 检验一个1-20-1的BP神经网络逼近一个带噪声的正弦函数的情况。
解:若采用trainrp函数逼近,得到的结果如图8-7所示
图8-7 BP神经网络trainrp逼近结果
如果采用trainbr函数,程序代码如下:
function exp85; clear all; p=[-1:0.05:1]; tt=sin(2*pi*p); t=sin(2*pi*p)+0.1*randn(size(p)); net=newff(minmax(p),[20 1],{'tansig','purelin'},'trainrp'); net.trainParam.show=10; net.trainParam.epochs=50; net.trainParam.goal=0.001; net=train(net,p,t); y=sim(net,p); plot(p,tt,p,y,'-') | %minmax命令表示取p的极值 %每训练10次显示一次结果 %误差达到0.001则停止训练 |
训练后得到的拟和结果见图8-8。
图8-8 BP神经网络trainbr逼近结果
比较图8-7和图8-8可以看出,函数的拟和程度有了明显的提高。
在实际应用中,经常会遇到一些非线性的输入输出曲线,且没有明确的函数关系,借助神经网络可以实现曲线拟和,从而方便的解决这一问题。
例8.6 已知某系统输出与输入的部分对应关系如表8-3所示,设计一BP神经网络,完成的曲线拟和。
表8-3 函数的部分对应关系
-1 | -0.9 | -0.8 | -0.7 | -0.6 | -0.5 | -0.4 | |
-0.832 | -0.423 | -0.024 | 0.344 | 1.282 | 3.456 | 4.02 | |
-0.3 | -0.2 | -0.1 | 0 | 0.1 | 0.2 | 0.3 | |
3.232 | 2.102 | 1.504 | 0.248 | 1.242 | 2.344 | 3.262 | |
0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1 | |
2.052 | 1.684 | 1.022 | 2.224 | 3.202 | 1.984 | 2.542 |
解:以隐层节点数为15的两层BP网络来实现其曲线拟和。程序代码如下:
function exp86; clear all; p=[-1:0.1:1]; t=[-0.832 … 2.542]; net=newff([-1 1],[15 1],{'tansig' 'purelin'},'traingdx','learngdm'); net.trainParam.epochs=2500; net.trainParam.goal=0.001; net.trainParam.show=50; net=train(net,p,t); r=sim(net,p); plot(p,t,p,r,'*') | %这里省略了输入,读者可自行补全 |
在训练的过程中,Matlab会给出误差的变化情况,在主程序窗口中,显示为;:
>> TRAINGDX, Epoch 0/2500, MSE 14.5069/0.001, Gradient 19.2415/1e-006
TRAINGDX, Epoch 50/2500, MSE 0.570044/0.001, Gradient 0.493064/1e-006
TRAINGDX, Epoch 100/2500, MSE 0.0738583/0.001, Gradient 0.0616707/1e-006
TRAINGDX, Epoch 150/2500, MSE 0.013156/0.001, Gradient 0.0519979/1e-006
TRAINGDX, Epoch 200/2500, MSE 0.00824782/0.001, Gradient 0.017902/1e-006
TRAINGDX, Epoch 229/2500, MSE 0.000974131/0.001, Gradient 0.0223226/1e-006
TRAINGDX, Performance goal met.
根据上面的信息可以看到,训练在进行到229次的时候(程序代码要求进行2500次),由于误差已经达到了精度要求(0.001),网络提前结束了训练。同时,Matlab还给出了图形化的显示,如图8-9。
图8-9 网络训练误差递减的情况
上图中10^3处有一条横线,表示误差减小到这天横线之下则训练自动停止。程序最后给出了仿真情况的拟和图像,见图8-10。
图8-10 BP网络方针情况
观察以上的结果可以看出,网络仿真的情况还是很好的。
BP网络式多层网络,从理论上讲,只要对隐层中神经元的数目不加限制,两层BP网络就可以实现从输入到输出的任意函数映射,所以与线性神经网络比较,BP网络的功能更强,应用更广。
BP网络的学习规则与LSM学习规则一样,都是采用使均方误差最小的最速下降算法,不同的是梯度的计算方法不同。最速下降BP算法存在收敛速度慢,易陷入局部最小、易产生振荡等不足,但BP网络仍然是目前应用最广、最成功的神经网络模型。
神经网络是20世纪40年代新兴起来的一种计算机模拟人工智能技术。它利用计算机强大的运算功能,无须建立明确的数学模型,单纯的通过对权值的调整即可得到良好的拟合效果。神经网络的应用领域极其广泛,涵盖了模式识别、人工智能、自动控制等多个方面。
BP神经网络是20世纪80年代由美国加利福尼亚州的PDP小组提出的一种误差反向传播的神经网络模型。它具有较强的学习性、自适应性和容错性,是近年来在预测领域应用比较广泛的神经网络模型之一。利用BP神经网络进行的预测的关键在于预测精度,本文讨论了BP神经网络在长期预测中存在的精度问题。
BP神经网络matlab源程序代码)
%******************************%
学习程序
%******************************%
%======原始数据输入========
p=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;...
3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;...
4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;...
2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;...
2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;...
3489 3172 4568;3172 4568 4015;]';
%===========期望输出=======
t=[4554 2928 3497 2261 6921 1391 3580 4451 2636 3471 3854 3556 2659 ...
4335 2882 4084 1999 2889 2175 2510 3409 3729 3489 3172 4568 4015 ...
3666];
ptest=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;...
3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;...
4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;...
2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;...
2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;...
3489 3172 4568;3172 4568 4015;4568 4015 3666]';
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %将数据归一化
NodeNum1 =20; % 隐层第一层节点数
NodeNum2=40; % 隐层第二层节点数
TypeNum = 1; % 输出维数
TF1 = 'tansig';
TF2 = 'tansig';
TF3 = 'tansig';
net=newff(minmax(pn),[NodeNum1,NodeNum2,TypeNum],{TF1 TF2 TF3},'traingdx');
%网络创建traingdm
net.trainParam.show=50;
net.trainParam.epochs=50000; %训练次数设置
net.trainParam.goal=1e-5; %训练所要达到的精度
net.trainParam.lr=0.01; %学习速率
net=train(net,pn,tn);
p2n=tramnmx(ptest,minp,maxp);%测试数据的归一化
an=sim(net,p2n);
[a]=postmnmx(an,mint,maxt) %数据的反归一化 ,即最终想得到的预测结果
plot(1:length(t),t,'o',1:length(t)+1,a,'+');
title('o表示预测值--- *表示实际值')
grid on
m=length(a); %向量a的长度
t1=[t,a(m)];
error=t1-a; %误差向量
figure
plot(1:length(error),error,'-.')
title('误差变化图')
grid on