粒子群算法在神经网络非线性函数
拟合中的应用
一、本文研究和解决的问题
在自动控制问题中,系统辨识的目的是为了建立被控对象的数学模型。
多年来,控制领域对于复杂的非线性对象的辨识一直未能很好的解决,神经网络所具有的非线性特性和学习能力使其在系统辨识方面有很大的潜力。
为解决具有复杂的非线性、不确定性和不确知对象的辨识问题开辟了一条有效的途径。
基于神经网络的系统辨识是以神经网络作为被辨识对象的模型,利用其非线性特性,可建立非线性系统的静态或动态模型。
理论上,多层前馈神经网络能够以任意精度逼近任意非线性映射。
但传统神经网络学习算法中存在的收敛速度慢、容易陷入局部最优等缺点,于是设计了基于标准粒子群算法的神经网络非线性函数拟合系统。
二、传统的BP神经网络
BP 神经网络即采用误差反向传播算法的网络,是一种至今仍然最为流行的前馈型神经网络模型。
BP 神经网络有很强的非线性映射能力,它能学习和存贮大量输入-输出模式映射关系,而无需事先了解描述这种映射关系的数学方程。
只要能提供足够多的样本模式对供给网络进行学习训练,它便能完成由n 维输入空间到m 维输出空间的非线性映射。
BP 学习算法属于误差修正型学习,其关键在于根据误差修正输出层和隐含层的连接权值。
其学习的基本实现方法是基于最小平方误差准则和梯度下降优化方法来确定权值调整法则。
BP网络建模特点:
非线性映照能力:神经网络能以任意精度逼近任何非线性连续函数。
在建模过程中的许多问题正是具有高度的非线性。
并行分布处理方式:在神经网络中信息是分布储存和并行处理的,这使它具有很强的容错性和很快的处理速度。
自学习和自适应能力:神经网络在训练时,能从输入、输出的数据中提取出规律性的知识,记忆于网络的权值中,并具有泛化能力,即将这组权值应用于一般情形的能力。
神经网络的学习也可以在线进行。
数据融合的能力:神经网络可以同时处理定量信息和定性信息,因此它可以利用传统的工程技术(数值运算)和人工智能技术(符号处理)。
多变量系统:神经网络的输入和输出变量的数目是任意的,对单变量系统与多变量系统提供了一种通用的描述方式,不必考虑各子系统间的解耦问题。
三、解决问题的思想与方法
针对传统神经网络学习算法中存在的收敛速度慢、容易陷入局部最优等缺点,设计了基于标准粒子群算法的神经网络非线性函数拟合系统,将神经网络中的权值看作一个粒子,通过粒子之间的竞争与合作以完成网络的学习过程,仿真结果表明,基于BP的神经网络学习算法在收敛速度、辨识精度等方面要优于传统的BP神经网络。
粒子群优化算法(PSO,Particle Swarm Optimization)是计算智能领域,除了蚁群算法、鱼群算法之外的一种群体智能的优化算法。
PSO 算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效的方法就是搜寻当前距离食物最近的鸟的周围区域。
PSO 算法首先在可解空间中初始化一群粒子,每个粒子都代表问题的一个潜在解,用位置、速度和适应度值三项指标表示该粒子特征。
适应度值由适应度函数计算得到,其值的好坏表示粒子的优劣。
粒子的速度决定了粒子移动的方向和距离,速度随自身及其他粒子的移动经验进行动态调整,从而实现个体在可解空间中的寻优。
粒子在解空间中运动,通过跟踪个体最优值Pbest 和群体最优值Gbest 更新个体位置,个体最优值Pbest 是指个体所经历位置中计算得到的适应度值最好的位置,群体最优值Gbest 是指粒子群中所有粒子搜索到的适应度最好的位置。
粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体最优值、群体最优值的适应度值更新Pbest 和Gbest 的位置。
粒子位置和速度的调整是粒子群算法的关键。
假设在一个D 维的搜索空间中,由n 个粒子组成的种群X ( X1, X 2 ,……, X n ) ,其中第i 个例子表示为一个D 维的向量X i (xi1, xi 2 ,……, xiD )T ,代表第i 个粒子在D维搜索空间中的位置,亦代表问题的一个潜在解。
根据目标函数即可计算出每个粒子位置Xi 对应的适应度值。
第i 个粒子的速度为Vi (vi1, vi 2 ,……, viD )T ,其个体极值为P ( pi1, pi 2 ,……, piD )T ,种群的全局极值为P( pg1, pg 2 ,……, pgD )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);
for epoch=1:max_epoch
E=0;m=1;oi=0;ok=0;%置隐含层和输出层各神经元输出初值为零;for m=1:100
%计算隐含层各神经元输出;
NETi=x(m)*Wij+b*Wb;
for t=1:q
oi(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;
%调整隐含层加权系数;。