前言:

本文主要参考B站的一篇学习视频后,加之自己的理解和浓缩精华,不想看文字的可以直接划到末尾去b站看原视频,非常通俗易懂。

理论知识:

感性认知:如下面一张图片所示。在一个范围内,以三点(三)为例,假如此时A点为目前的最优点,那么B点和C点都可能会向A点靠,但不是直接到A点而是下一步(下一个迭代循环)会向A点靠。
在这里插入图片描述
简化版过程:
C—直接—>A:(1,1) = (2,3)+(-1,-2)
———————>A点=原始位置+位移的方向和大小
C—靠近—>A:(1,1) = (2,3)+rand*(-1,-2)
———————>A点=原始位置+位移的方向和大小(rand为0-1之间的随机数)
在实际中,C点的位移方向大小由三个参数所确定
1、惯性(上一次迭代时候的位移大小和方向)
2、自身希望的位移大小和方向
3、全局最优的位移大小和方向
由这三个参数共同确定其最后的位移方向和大小,每次迭代都会更新位移的方向和大小,进而确定下一次该粒子往什么方向位移,位移多少。当然这些量都有对应的公式计算,将这些粒子的数量扩大,并且用一个数学模型表示出来就得到了粒子群算法的基本原理。

数学模型:

  1. 在一个D维空间中,有N个粒子,每个粒子可以表示一个D维的向量,如下:
    Xi = (xi1, xi2, xi3…xiD),其中i=1,2,3…N
  2. 第i个粒子的“飞行”速度,也是一个D维的向量,如下:
    Vi = (vi1, vi2, vi3…viD), 其中i=1,2,3…N
  3. 在第t代中的某个粒子,向比t+1代更新时的更新公式如下:
    先计算位移大小:Vij(t+1) = wvij(t) + c1r1(t)[Pij(t) - xij(t)] + c2r2(t)[Pgi(t) - xij(t)]
    再更新位置:xij(t+1) = xij(t) + Vij(t+1)
    下面我逐一解释一下上述方程的各个变量的意思:
    w:惯性权重
    vij(t):上一次迭代的速度。其与w相乘=w
    vij(t)就得到了整个惯性变量。
    c1:参数1,可以理解为学习率,就是控制每次迭代粒子步幅的权重。
    r1(t):0-1之间的随机数,与c1一起起作用。
    Pij(t):个体认为的最优点。
    至此c1r1(t)[Pij(t) - xij(t)]:向每个个体粒子飞行的具体方向和大小。
    c2:社会学习率,就是控制整个种群(所有变量粒子)的学习率。
    r2:同理r1与c2一起起作用。
    Pgi(t):全局认为的最优点。
    至此c2r2(t)[Pgi(t) - xij(t)]:向全局最优点应该飞行的具体方向和大小

    注意:不是更新位置就一定是更新位置,若更新后的点xij(t+1)的适应度不如原位置xij(t),则不更新位置,保留在原位置。(适应度后面解释)

算法流程:

首先:设置各个参数:w:0.5-0.8;c1、c2:0.1-2;以及vmax和xmax:粒子的飞行边界,取决于优化函数。
接下来介绍算法具体步骤:

  1. 初始化粒子群:设定粒子个数N,并将所有的粒子初始到某个值(位置)上
  2. 计算所有粒子的适应度。
  3. 计算待更新的粒子的新速度,以及待更新粒子的新位置(大小和方向)
  4. 计算新位置的适应度,若新位置适应度更高,则将粒子位置更新,否则不更新
  5. 判断迭代次数等条件是否满足终止循环条件,若满足,则退出且输出最优结果,否则返回第二步继续迭代计算。
    PS:适应度的解释:就是满足我们需要优化的函数的结果的程度。例如,我们需要优化一个函数,并找到其的最小值,那么这个适应度就是值该粒子的函数值是不是全局最小的,或者比上一次的粒子的函数值更小,这个粒子的函数值就是否更小就作为本次迭代的粒子的适应度。
    PS:在第三步中,计算出下一步粒子的速度和位置后,需要先进行一个边界检测,看速度和位置是否大于边界值,若速度或位置大于边界值,则直接用边界值替换该计算结果即可。
    提醒:在初始化比如50个粒子时,在100次迭代中,找到了全局最优解(例如最小值),但不是意味着所有50个粒子全都收敛到了最小值的位置,我们只需要在100次迭代后有至少一个粒子收敛到了全局最优的位置,我们就能够得到这个最优解。别的粒子可能因为学习率等原因没能向最优解靠近,也没问题。但是这种模型的参数肯定是不如那种能够全体收敛至最优解的模型的参数来得好的。

优缺点分析:

优点:原理简单,容易实现,参数较少。
缺点:容易早熟收敛,导致局部最优,且迭代后期的收敛速度很慢
解释:w参数前期要大一些,保证粒子的个体独立性强一些,能够多搜索一些位置,后期要小一些,多向其他粒子学习,尽可能收敛到全局最优。
参数设置的一些其他规律:前期:c1大一些c2小一些,保证粒子独立性。后期:c1小一些c2大一些,尽快收敛至全局最优。

改进方法:

  1. 针对以上参数的设定原理,实现参数的自适应变化这是对模型提升的一个好办法,例如可以将w设置成一个随着迭代次数增大而递减的函数。
  2. 引入一些其他因素,比如速度,边界值随着迭代次数而增大或减小等等方法。
  3. 结合一些其他的只能优化算法,例如遗传算法(GA),免疫算法,模拟退火算法等等,来帮助粒子跳出局部最优,改善收敛速度。

参考:

参考b站相关视频——通俗易懂讲算法-最优化之粒子群优化(PSO)
链接:通俗易懂讲算法-最优化之粒子群优化(PSO)
谢谢b站这位up主的讲解,非常通透。

后续

后续会有时间分析一些别的优化算法的自己的相关学习理解——遗传算法(GA)、梯度下降算法、主成分分析(PCA)等。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐