照片由 James Wainscoat 在 Unsplash 拍摄
有一个笑话让我忍俊不禁:
“你知道吗,在时钟发明之前,人们不得不积极四处走动,向别人询问时间?”
显然没有必要解释这个笑话,但如果我们要稍微深入思考一下(就像好的数学家那样),我们可以说这个笑话是关于这样一个事实:群体中粒子的信息可以用来告知其他所有粒子。这个概念实际上比我刚才说的笑话要深得多,并且可以进一步利用。
让我们考虑一个自组织系统,比如鸟群或鱼群。我们可以将这个系统定义为由粒子(例如,一个粒子是一只鸟)组成的。我们还可以假设,在相当大的程度上,这些粒子在空间中移动,根据两个因素调整它们的位置:
-
特定粒子所知道的最佳位置:鸟儿认为对自己最好的。
-
所有粒子通过“相互沟通”给出的全局最佳位置:鸟儿被“主鸟”指示要做什么
现在,自然界中的“最佳”是什么?对鸟儿来说,什么是最优的选择?对“群体”来说,什么是最优的?我绝对不是问这个问题的人,因为我真的不知道。我所知道的是,通过观察自然界中的这种行为,我们能够形式化一个非常迷人的优化算法。换句话说,如果我们定义了什么是最佳,那么我们可以使用这种进化方法来优化我们选择的功能。
这个算法被称为粒子群优化(PSO)。我知道,这是一个很大的跳跃。什么是“优化”?为什么我们突然开始谈论数学?我们要优化什么?在这篇文章中,我将尝试涵盖所有这些步骤,更重要的是,我们将使用基于对象的编程在 Python 中创建我们自己的 ParticleSwarmOptimizer() 类。换句话说,我们将从理论到实践全面覆盖 PSO 世界。
让我们开始吧!🐦🐦🐦
0. 介绍“优化”
我有一种感觉,如果你在阅读关于“粒子群优化”的内容,你可能已经对“优化”有一些了解,但你可能不知道“粒子群”这个概念,所以我不想在这方面花费太多时间,以免让读者感到无聊。
我真正想知道的是给这个问题一点形式化的定义。正如我们之前所说的,从数学上讲,“对于一群鸟”的最佳做法是什么?
好吧,从数学上讲,“鸟群”中的“鸟”(或“粒子”)是 K 维空间中的点。如果它是真实空间,我们的“域”可以是我们在其中生活的 3D 空间,但它确实可以比这大得多。实际上,当我们忘记“鸟”的例子,并考虑我们可以一般地使用这种方法来找到给定函数的最小值或最大值时,这种方法变得很有趣。
例如,假设房价完全由算法自动生成仅(非常危险,不应该让一个人在循环中,但无论如何):
作者制作的照片
现在这点不太有意义,对吧?什么是“房子”图标?我们将有一个特征列表,例如,位置、大小等…
作者制作的照片
现在这就有意义了。房子被转换到了特征空间。所以每个房子都是一个 k 维的点。将特征空间转换为房价的“过程”是一个“黑盒”函数:
这里真正的游戏是这样的:
“我需要什么x才能得到最小成本?”
这就是我们的优化问题。
作者制作的照片
PSO 的最终结果将是x_min的坐标。让我们看看我们如何处理它。
1. 粒子群优化算法简介
在我们开始之前,我想说,查看原始**论文是非常有用**的。我认为这是我读过的最不技术性的技术论文之一。它非常容易阅读,同时信息量很大,也很有趣。
好吧,那么,这个想法背后的东西是什么?正如我们所说的,想法是我们正在创建一组粒子,它们通过交换它们拥有的信息来合作找到全局最小值。如果你想的话,它非常类似于在像“怪奇物语”这样的节目中发生的事情,那里有一个要打败的敌人,所有的角色都一起工作,并使用他们所有的手段互相交谈。
更技术性地,我们开始时有num_particles个粒子。这些粒子有随机的位置,对于这些位置中的每一个,成本函数 L 都会有一个值。例如,粒子 1 将具有位置x_1和成本L(x_1)。这是第 0 次迭代,"之后"这次第一次迭代,我们已经建立了我们的系统。现在系统需要进化。我们如何做到这一点?通过一个叫做“速度”的量。我们说,对于粒子 x,对于每个维度(i)和每个迭代(j),我们都有:
由作者制作的照片
或者以更优雅的 向量 形式:
由作者制作的照片
现在我们如何定义 v?这正是这种方法之美的所在。向量 v 基本上有三个组成部分:
由作者制作的照片
让我们来看看它们:
- v_intertial 主要是先前速度的 记忆。这个术语来自 物理,其中惯性系统是一个参考系,其中物体将保持静止或以恒定速度移动。
由作者制作的照片
其中 k_intertial 是一个常数。
- v_cognitive 是由 自身 粒子(以某种方式具有认知能力)建议的速度。它表明我们应该朝着我们知道对那个粒子最有利的方向移动。我们还添加了一点点随机性 r_1(随机数):
由作者制作的照片
k_cognitive 仍然是一个常数。x_best 是 x 粒子的 最佳(最低成本函数)。
- v_social 从所有其他粒子收集信息。我们朝着对所有粒子最有利的方向移动。
由作者制作的照片
k_social 是一个常数,r2 是一个随机值,x{全局最佳} 是 所有 粒子的 最佳(最低成本函数)。
现在,我认为这非常优雅。让我们总结一下:
-
我们首先选择一定数量的 随机粒子(即位于 随机 位置的粒子)
-
我们根据 速度参数 移动 这些粒子。
-
这些速度由三个因素决定:一个 惯性,它保留了先前速度的记忆,一个 认知 速度,它使我们朝着对粒子最有利的方向移动,以及一个 社会 速度,它使我们朝着整个粒子群建议的方向移动。
-
我们在每个迭代中改变这些粒子的位置,直到达到 num_iteration。然后我们选择最佳选项。
好了,今天就说到这里。让我们运行一些 Python 😊
2. PSO 实现
我们将使用 两个类 来构建我们的 PSO。第一个是单个 粒子 的类,另一个类基于单个粒子类作为构建器,构建我们的 群体。
我希望你们首先构建一个 constants.py 文件。这个文件保存所有默认信息,如粒子的边界、迭代次数以及所有 k 值。如何更改这些?你需要创建一个 .json 文件,并将其命名为 “config/pso_config.json”。如果你没有,我将在类中提供的脚本会为你构建它。
1595

被折叠的 条评论
为什么被折叠?



