Particle Swarm optimization(PSO)---粒子群算法

粒子群算法(PSO)

简介

粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
PSO同遗传算法类似,是一种基于迭代的优化算法。系统初始化为一组随机解,通过迭代搜寻最优值。但是它没有遗传算法用的交叉(crossover)以及变异(mutation),而是粒子在解空间追随最优的粒子进行搜索。同遗传算法比较,PSO的优势在于简单容易实现并且没有许多参数需要调整。目前已广泛应用于函数优化,神经网络训练,模糊系统控制以及其他遗传算法的应用领域。
如前所述,PSO模拟鸟群的捕食行为。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个”极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。

其实,粒子群算法,就我个人理解,就是一群人合作玩儿打猎的游戏,该游戏提供给玩家的信息有:1.玩家自己距离猎物的距离(fitness value);2.玩家自己曾经找到过得一系列位置,包括曾经距离猎物最近的位置 (Pi) ;3.所有玩家中距离猎物最近的位置 (Pg) (或者自己周围玩家距离猎物最近的位置 (Pnk) )。我们如何通过这一系列的信息以最快速度找到猎物的位置呢?粒子群算法告诉我们如何去移动从而找到猎物。当我们使用全局信息时,我们结合者自己曾经找到过的离猎物最近的位置和现在所有玩家离猎物最近的位置,来思考我们下一步该怎么走,其实所有人在接收到多个有用信息时,都会给这些信息的重要性排个序,然后融合这些信息来走,这个重要性在公式中的表现就是权重,然后所有玩家都以这种方式来更新自己的位置,就会逐渐都找到同一个位置,即逐渐收敛,从而找到一个就目前而言最佳的位置(可能局部最优也可能全局最优)。而当我们使用局部信息时,我们只需要把接收到的所有玩家离猎物最近的位置更改为我周围玩家的离猎物最近的位置即可,其余的都一样。在这里,有一个问题会被思考,即什么样的玩家算作是我周围的玩家,这里会在后面的局部粒子算法中详细介绍。

两种粒子群算法

全局粒子群算法

全局粒子群算法中,粒子值的更新是依据自己搜到的历史最优值 (Pi) 和全部粒子搜到的最优值 (Pg) 来决定的。其速度与位置的更新公式如下:

Vk+1id=ωVkid+c1ϵ(PkidXkid)+c2η(PkgdXkid)1
Xk+1id=Xkid+rVkid2

  • ω 保持原来速度的系数,惯性权重
  • c1: 粒子跟踪自己历史最优值的权重系数(通常设为2)
  • c2: 粒子跟踪群体最优值得权重系数(通常设为2)
  • ϵ,η: (0,1) 之间的随机数
  • r: 约束因子(通常设为1)

我们根据该公式不断的迭代更新每个粒子的适应值,从而逐渐的收敛找到最优值

局部粒子群算法

局部粒子群与全局粒子群的差别只是在一个依据全局最优值,一个依据局部最优值,因此只需要将公式(1)中的全剧最优值 Pkgd 改为局部最优值 Pnk 即可。在这里,有一个更加需要注意的是如何选取某个粒子的领域?常用的领域选取法有以下两种:

  • 按照粒子的拓扑结构来选取
    粒子的拓扑结构是由粒子的编号来决定的,常用的拓扑结构有:环形、随机环形、轮形和随机轮形。详见:拓扑结构的详细描述
  • 按照粒子之间的欧氏距离来选取
    基于空间距离来决定粒子的领域。假设阈值为 α (每一次迭代都会发生变化),在每一次迭代中,首先计算每一个粒子与群中其他粒子之间的距离,记录任何2个粒子之间的最大距离,设为 d ,对每一对粒子,计算 ||XaXb||d ,当 ||XaXb||d<α 时,则认为b粒子在a粒子的领域内。一般来说,一个粒子的领域会随着迭代次数的增加而逐渐增大,增长趋势与迭代次数成线性关系,初始值为0,最终值为整个粒子群

总结:

对于这两种算法,各有优劣。其中,全局粒子群算法收敛速度快,但是容易收敛到局部最优,而局部粒子群算法则收敛速度慢,计算量大(因为要计算每个粒子之间的距离),但不容易陷入局部最优的问题

你可能感兴趣的:(机器学习,进化算法)