这是关于 PSO 是什么以及如何使用它的教程
欢迎来到雲闪世界。有一个笑话让我笑翻了:
“您知道吗,在时钟发明之前,人们必须主动四处走动并询问时间?”
显然,这个笑话无需解释,但如果我们稍微思考一下(就像优秀的数学家那样),我们可以说这个笑话是关于一个群体中一个粒子的信息可以用来告知所有其他粒子的事实。这个概念实际上比我刚才说的笑话要深刻得多,可以进一步利用。
让我们考虑一个自组织系统,例如鸟群或鱼群。我们可以将该系统定义为由粒子组成的系统(例如,粒子是鸟)。我们还可以近似地假设这些粒子在空间中移动,根据两个因素调整它们的位置:
- 特定粒子知道的最佳位置:鸟儿认为对自己来说最好的位置。
- 所有粒子相互“交流”给出的全局最佳位置:小鸟按照“主鸟”的指令做什么
那么,自然界中什么是“最佳”的?对鸟类来说最好的事情是什么?对“群体”来说最好的事情是什么?我绝对不是问这个问题的合适人选,因为我真的不知道。我确实知道的是,通过观察自然界中的这种行为,我们能够形式化一种非常有趣的优化算法。换句话说,如果我们确实定义了什么是最好的,那么我们就可以使用这种进化方法来优化我们选择的功能。
这种算法被称为粒子群优化 (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 是一个常数,r_2 是一个随机值,x_{global best} 是所有粒子的最佳值(最低成本函数) 。
现在,我认为这是非常优雅的。让我们总结一下:
- 我们首先选择一定数量的随机粒子(即随机位置的粒子)
- 我们根据速度参数移动这些粒子
- 这些速度由三个因素决定:惯性,它保留对先前速度的记忆;认知速度,它使我们沿着对粒子最有利的方向移动;社会速度,它使我们沿着整个粒子群所建议的方向移动。
- 我们每次迭代都会不断改变这些粒子的位置,直到达到 num_iteration。然后我们选择最佳选项。
好了,今天就说这么多。让我们运行一下Python吧:)
2. PSO 实现
我们将使用两个类来构建我们的 PSO。第一个是单个粒子的类,另一个类以单个粒子类作为构建器来构建我们的群体。
我要你构建的第一件事是constants.py文件。该文件保留所有默认信息,例如粒子的边界、迭代次数和所有 k 值。你如何更改它?你需要创建一个 .json 文件并将其命名为“ config/pso_config.json ”。如果你没有,我将在课程中提供的脚本将为你构建它。
现在,我们在代码中说的所有内容都在一个 .py 文件中,我将其命名为particle_swarm_optimizer.py
我用几句话向你描述一下:
- Particle () 构建单个粒子。从随机位置开始,然后使用update_velocity () 和update_position()函数根据我们上面所说的更新速度和位置(你可以检查一下以确保我没有撒谎)。
- ParticleSwarmOptimizer () 需要两个对象:Particle()类,用于构建类(您可以通过向粒子添加特征或修改更新特征来使算法更加复杂),objective_function是我们想要最小化的黑盒函数。
现在,节目的主角当然是 ParticleSwarmOptimizer()。使用optimize (),我们将运行优化过程。我们可以选择是否要打印结果(每次迭代的迭代)以及是否要解决方案数组(再次,每次迭代的迭代)。plot_pso_convergence ( ) 将在绘图阶段为我们提供帮助。如果设置animated=True,您 将获得收敛的 .GIF,这意味着您将看到全局最小移动、每次迭代的迭代(非常酷的东西,您将在一秒钟内看到它)。
3. 实际示例
我们之前已经完成了所有脏活,现在我们只需几行代码就可以运行所有东西。如果我们选择一个非常简单的二次函数:
图片由作者制作
这是我们生成的 .GIF:
图片由作者使用上述代码制作
现在,即使对于相当复杂的目标函数,PSO 也能做得非常好,例如:
图片由作者制作
运行上面相同的代码我们得到:
这是 .GIF:
图片由作者使用上述代码制作
因此,我们可以看到,我们的小 PSO 不仅在存在一个明显最小值的情况下达到最小值,而且即使在更复杂且具有多个局部最小值的情况下,它也能达到全局(我们相信,因为我们无法通过分析来判断)最小值。
4. 结论
非常感谢您花时间与我一起完成优化过程。我希望我能最大限度地发挥您的知识,因为这是一篇面向数据科学的博客文章。🙂
在本文中,我们做了以下工作:
- 我们描述了通过同时分析多个粒子的信息来解决问题的想法
- 我们用房价最小化这个非常简单的用例描述了“优化”任务。
- 我们概括地讨论了粒子群优化 (PSO) ,并讨论了其背后的迷人理念
- 我们进入了方程的世界,看到了算法如何为 num_particles 个粒子演化出一个初始随机状态,并得到全局最小值的最佳估计
- 我们使用基于对象的编程从头开始实现PSO 。
- 我们在一个非常简单的二次问题和一个复杂得多的多最小值问题上进行了测试。在这两种情况下,我们都看到了非常有希望的结果!
感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)