您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 粒子群算法在神经网络非线性函数拟合中的应用
粒子群算法在神经网络非线性函数拟合中的应用一、本文研究和解决的问题在自动控制问题中,系统辨识的目的是为了建立被控对象的数学模型。多年来,控制领域对于复杂的非线性对象的辨识一直未能很好的解决,神经网络所具有的非线性特性和学习能力使其在系统辨识方面有很大的潜力。为解决具有复杂的非线性、不确定性和不确知对象的辨识问题开辟了一条有效的途径。基于神经网络的系统辨识是以神经网络作为被辨识对象的模型,利用其非线性特性,可建立非线性系统的静态或动态模型。理论上,多层前馈神经网络能够以任意精度逼近任意非线性映射。但传统神经网络学习算法中存在的收敛速度慢、容易陷入局部最优等缺点,于是设计了基于标准粒子群算法的神经网络非线性函数拟合系统。二、传统的BP神经网络BP神经网络即采用误差反向传播算法的网络,是一种至今仍然最为流行的前馈型神经网络模型。BP神经网络有很强的非线性映射能力,它能学习和存贮大量输入-输出模式映射关系,而无需事先了解描述这种映射关系的数学方程。只要能提供足够多的样本模式对供给网络进行学习训练,它便能完成由n维输入空间到m维输出空间的非线性映射。BP学习算法属于误差修正型学习,其关键在于根据误差修正输出层和隐含层的连接权值。其学习的基本实现方法是基于最小平方误差准则和梯度下降优化方法来确定权值调整法则。BP网络建模特点:非线性映照能力:神经网络能以任意精度逼近任何非线性连续函数。在建模过程中的许多问题正是具有高度的非线性。并行分布处理方式:在神经网络中信息是分布储存和并行处理的,这使它具有很强的容错性和很快的处理速度。自学习和自适应能力:神经网络在训练时,能从输入、输出的数据中提取出规律性的知识,记忆于网络的权值中,并具有泛化能力,即将这组权值应用于一般情形的能力。神经网络的学习也可以在线进行。数据融合的能力:神经网络可以同时处理定量信息和定性信息,因此它可以利用传统的工程技术(数值运算)和人工智能技术(符号处理)。多变量系统:神经网络的输入和输出变量的数目是任意的,对单变量系统与多变量系统提供了一种通用的描述方式,不必考虑各子系统间的解耦问题。三、解决问题的思想与方法针对传统神经网络学习算法中存在的收敛速度慢、容易陷入局部最优等缺点,设计了基于标准粒子群算法的神经网络非线性函数拟合系统,将神经网络中的权值看作一个粒子,通过粒子之间的竞争与合作以完成网络的学习过程,仿真结果表明,基于BP的神经网络学习算法在收敛速度、辨识精度等方面要优于传统的BP神经网络。粒子群优化算法(PSO,ParticleSwarmOptimization)是计算智能领域,除了蚁群算法、鱼群算法之外的一种群体智能的优化算法。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效的方法就是搜寻当前距离食物最近的鸟的周围区域。PSO算法首先在可解空间中初始化一群粒子,每个粒子都代表问题的一个潜在解,用位置、速度和适应度值三项指标表示该粒子特征。适应度值由适应度函数计算得到,其值的好坏表示粒子的优劣。粒子的速度决定了粒子移动的方向和距离,速度随自身及其他粒子的移动经验进行动态调整,从而实现个体在可解空间中的寻优。粒子在解空间中运动,通过跟踪个体最优值Pbest和群体最优值Gbest更新个体位置,个体最优值Pbest是指个体所经历位置中计算得到的适应度值最好的位置,群体最优值Gbest是指粒子群中所有粒子搜索到的适应度最好的位置。粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体最优值、群体最优值的适应度值更新Pbest和Gbest的位置。粒子位置和速度的调整是粒子群算法的关键。假设在一个D维的搜索空间中,由n个粒子组成的种群X(X1,X2,……,Xn),其中第i个例子表示为一个D维的向量Xi(xi1,xi2,……,xiD)T,代表第i个粒子在D维搜索空间中的位置,亦代表问题的一个潜在解。根据目标函数即可计算出每个粒子位置Xi对应的适应度值。第i个粒子的速度为Vi(vi1,vi2,……,viD)T,其个体极值为P(pi1,pi2,……,piD)T,种群的全局极值为。四、实验仿真结果五、程序基本BP网络函数逼近程序function[epoch,s,Wki,Wij,Wb,Ez]=dyb(lr,Emin,q)%初始化;%lr学习效率;Emin为期望误差最小值;q为隐含层节点数;b=1;sum=0;Ez=[];max_epoch=30000;%max_epoch训练的最大次数;%提供训练集和目标值;x=8.*rand(1,100)-4;y=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);%初始化Wki,Wij;Wij=rand(1,q);Wki=rand(1,q);Wb=rand(1,q);forepoch=1:max_epochE=0;m=1;oi=0;ok=0;%置隐含层和输出层各神经元输出初值为零;form=1:100%计算隐含层各神经元输出;NETi=x(m)*Wij+b*Wb;fort=1:qoi(t)=1/(1+exp(-NETi(t)));end%计算输出层各神经元输出;NETk=Wki*oi';ok=NETk;%计算误差;E=E+(y(m)-ok)^2;%调整输出层加权系数;deltak=y(m)-ok;Wki=Wki+lr*deltak*oi;%调整隐含层加权系数;deltai=oi.*(1-oi).*(deltak*Wki);Wij=Wij+lr.*deltai.*x(m);Wb=Wb+lr.*deltai;endEz(epoch)=sqrt(E/100);ifEz(epoch)Eminbreak;endend%计算测试输出;x=linspace(-4,4,100);%给定输入:y=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);fori=1:100NETi=x(i).*Wij+b*Wb;NETk=0;fort=1:qoi(t)=1/(1+exp(-NETi(t)));NETk=NETk+Wki(t)*oi(t);endok(i)=NETk;sum=sum+(y(i)-ok(i))^2;%输出总误差;ends=sqrt(sum/100);计算函数:function[cs,wc]=jsdyb(lr,q)Emin=0.1;s1=0;s2=0;fork=1:5[x1,x2]=dyb(lr,Emin,q);s1=s1+x1;s2=s2+x2;endcs=s1/5;wc=s2/5;functionA=zjsdyb(lr)q=[4,5,7,8,10];formatshortgA=[];forzk=1:5[cs,wc]=jsdyb(lr,q(zk));B=[cs,wc];A=[A;B];end图形显示函数:functiontxdyb(lr,q)%计算测试输出;Emin=0.1;b=1;[epoch,s,Wki,Wij,Wb,Ez]=dyb(lr,Emin,q)x=linspace(-4,4,100);%给定输入:y=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);fori=1:100NETi=x(i).*Wij+b*Wb;NETk=0;fort=1:qoi(t)=1/(1+exp(-NETi(t)));NETk=NETk+Wki(t)*oi(t);endok(i)=NETk;end%显示图形;figureplot(x,ok,'r')holdony=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);plot(x,y,'b')title('Hermit多项式曲线与BP网络输出曲线')legend('BP曲线','Hermit曲线')holdofffigureplot(x,ok,'or')holdonx=8.*rand(1,100)-4;y=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);plot(x,y,'*k')title('训练样本与测试样本')xlabel('inputx')ylabel('outputy')legend('测试样本','训练样本')figureplot([1:length(Ez)],Ez)title('收敛曲线')clcPSO优化神经网络程序clcclearall%一、初始化部分%1.1预处理样本数据%选取训练样本(x,y)fori=1:100x=8.*rand(1,100)-4;y=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);%待逼近函数endAllSamIn=linspace(-4,4,100);%训练样本输入AllSamOut=y;%训练样本输出%选取测试样本fori=1:100x=8.*rand(1,100)-4;%测试样本输入ytest=1.1.*(1-x+2.*x.^2).*exp(-x.^2/2)+0.1*rand(1,100);%测试样本输出endAlltestIn=linspace(-4,4,100);AlltestOut=ytest;%归一化训练样本,测试样本[AlltestInn,minAlltestIn,maxAlltestIn,AlltestOutn,minAlltestOut,maxAlltestOut]=premnmx(AlltestIn,AlltestOut);%测试样本[AllSamInn,minAllSamIn,maxAllSamIn,AllSamOutn,minAllSamOut,maxAllSamOut]=premnmx(AllSamIn,AllSamOut);%训练样本testIn=AlltestInn;testOut=AlltestOutn;globalPtrain;Ptrain=AllSamInn;globalTtrain;Ttrain=AllSamOutn;%1.2设置神经网络参数globalindim;%输入层神经元个数indim=1;globalhiddennum;%隐藏层神经元个数hiddennum=3;globaloutdim;%输出层神经元个数outdim=1;globalGpos;%1.3设置微粒群参数vmax=0.5;%速度上限minerr=1e-7;%目标误差wmax=0.95;wmin=0.25;globalitmax;%最大迭代次数itmax=200;c1=1.5;c2=1.5;%权值随迭代次数线性递减以保证收敛foriter=1:itmaxW(iter)=wmax-((wmax-wmin)/itmax)*iter;enda=-1;b=1;m=-1;n=1;globalN;%微粒个数N=30;globalD;%每个微粒的维数D=(indim+1)*hiddennum+(hiddennum+1)*outdim;%所有权值和阈值%初始化微粒位置rand('state',sum(100*clock));%产生和时间相关的随机数globalX;X=a+(b-a)*rand(N,D,1);%X的值在a和b之间%初始化微粒速度V=m+(n-m)*rand(N,D,1);%V的值在m和n之间%二、微粒群更新迭代部分%globalnet;net=newff(minmax(Ptrain),[hiddennum,outdim],{'tansig','purelin'});globalgbest;%全局最优位置globalpbest;%局部最优位置%2.1第一次迭代fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain);%计算适应值[C,I]=min(fitness(:,1,1));%第一代,返回微粒群中最小适应值给C,该微粒的序号给IL(:,1,1)=fitness(:,1,1);%第一代
本文标题:粒子群算法在神经网络非线性函数拟合中的应用
链接地址:https://www.777doc.com/doc-2099622 .html