使用 Python 实现粒子群优化的理论与实践

这是关于 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. 结论

非常感谢您花时间与我一起完成优化过程。我希望我能最大限度地发挥您的知识,因为这是一篇面向数据科学的博客文章。🙂

在本文中,我们做了以下工作:

  1. 我们描述了通过同时分析多个粒子的信息来解决问题的想法
  2. 我们用房价最小化这个非常简单的用例描述了“优化”任务。
  3. 我们概括地讨论了粒子群优化 (PSO) ,并讨论了其背后的迷人理念
  4. 我们进入了方程的世界,看到了算法如何为 num_particles 个粒子演化出一个初始随机状态,并得到全局最小值的最佳估计
  5. 我们使用基于对象的编程从头开始实现PSO 。
  6. 我们在一个非常简单的二次问题和一个复杂得多的多最小值问题上进行了测试。在这两种情况下,我们都看到了非常有希望的结果!

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS17.0安装巨魔:TrollRestore巨魔发布

👻 TrollRestore 17.0 巨魔发布 15.0 - 16.7 RC(20H18)和17.0。 官网:https://trollrestore.com/ 下载:https://pan.metanetdisk.com/IOS/%E5%B7%A8%E9%AD%94%E7%8E%A9%E5%AE%B6/TrollRestore.com 使用:ht…

共享单车轨迹数据分析:以厦门市共享单车数据为例(一)

共享单车数据作为交通大数据的一个重要组成部分,在现代城市交通管理和规划中发挥着越来越重要的作用。通过对共享单车的数据进行深入分析,城市管理者和规划者能够获得大量有价值的洞察,这些洞察不仅有助于了解城市居民的日常出行模式&#xf…

希尔排序/选择排序

前言: 本篇主要对常见的排序算法进行简要分析,代码中均以数组 arr[] { 5, 3, 9, 6, 2, 4, 7, 1, 8 } 为例,进行升序排列。 常见的排序算法有如下: 选择排序中,直接选择排序没有任何实际与教育意义,而堆排…

基于Python爬虫的淘宝服装数据分析项目

文章目录 一.项目介绍二.爬虫代码代码分析 三. 数据处理四. 数据可视化 一.项目介绍 该项目是基于Python爬虫的淘宝服装数据分析项目,以致于帮助商家了解当前服装市场的需求,制定更加精确的营销策略。首先,需要爬取淘宝中关于服装的大量数据…

人工智能训练师边缘计算实训室解决方案

一、引言 随着物联网(IoT)、大数据、人工智能(AI)等技术的飞速发展,计算需求日益复杂和多样化。传统的云计算模式虽在一定程度上满足了这些需求,但在处理海量数据、保障实时性与安全性、提升计算效率等方面…

MyBatis-SQL-语句执行流程

已查询为例 首先我们可以看到,在查询的时候Mapper对象已经是被代理过后的: 所以会执行invoke方法,其底层实现就是JDK的动态代理: 如下图所示,如果MethodCache里面存在方法,则判断这个方法是否为default方…

Java异常体系----深入讲解

JAVA异常体系 1.error 错误 程序无法处理的异常, 它是由JVM产生和抛出的,比如OutOfMemoryError.ThreadDeath等 示例: public class Test {public static void main(String[] args) {run();}public static void run(){run();} }堆栈溢出,…

Selenium 实现图片验证码识别

前言 在测试过程中,有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试,怎么做图片验证码识别?本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk:1.8 tessdata&…

解决Django会话中的竞态条件

Django 会话中的竞态条件(race condition)问题通常发生在多个请求几乎同时修改同一个会话数据时,导致数据丢失或数据不一致。这种情况在需要频繁更新会话数据的场景(如实时聊天应用、并发请求处理等)中尤为常见。 1、问…

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2 软件环境 标签:C++ VSCode mingw gcc13 vcpkg cmake分栏:C++操作系统:Windows10 x64 22h2一、安装VScode-1.19.1 请参考另一篇文章《20240717-VSCode-1.91.1-部署gcc13-C++23-win10-22h2》。 二、安装cmake 本文流程需要安…

Java程序到CPU上执行 的步骤

相信很多的小伙伴在最初学习编程的时候会容易产生一个疑惑❓,那就是编写的Java代码究竟是怎么一步一步到CPU上去执行的呢?CPU又是如何执行的呢?今天跟随小编的脚步去化解开这个疑惑❓。 在学习这个过程之前,我们需要先讲解一些与…

Chrome 浏览器插件获取网页 window 对象(方案三)

前言 最近有个需求,是在浏览器插件中获取 window 对象下的某个数据,当时觉得很简单,和 document 一样,直接通过嵌入 content_scripts 直接获取,然后使用 sendMessage 发送数据到插件就行了,结果发现不是这…

硬盘分区、SD 卡被误格式化?格式化后恢复数据教程

硬盘分区、SD 卡、Android 手机被误格式化?别担心,奇客数据恢复内置格式恢复功能,是适合您的工具,因为如果重新格式化是误操作,无论是快速格式化、完整格式化还是驱动器报告未格式化,它都可以恢复格式化的数…

芯片解决方案--SL8541e-OpenHarmony适配方案

摘要 本文描述8541E芯片适配OpenHarmony的整体方案。 本文描述的整体方案,不止适用于8541e,也适用于该芯片厂家的其他芯片,如7863、7885,少部分子系统会略有差异。 整体方案架构 整体方案架构如下图,遵循OpenHarmo…

Android开发不支持Java,No,你选错了

Android Studio Giraffe | 2022.3.1 开始,选择Empty Activity模版,默认是Kotlin,很多同学以为Android Studio不支持Java开发了,其实Android Studio还是支持Java开发的,建议选择Empty Views Activity模版。 在Empty Vi…

AI智能分析/智慧安防EasyCVR视频汇聚平台新版本(V3.6.0)播放鉴权与播放限制时长的区别介绍

随着科技的飞速发展,视频技术已成为现代社会不可或缺的一部分,广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。EasyCVR视频汇聚平台作为视频技术的佼佼者,不断推陈出新,通过功能更新迭代,为用户提供更加…

如果电脑一直提示微软账号登录……

前言 今天小白接了个电脑故障问题:电脑提示微软账号登录,然后经过各种操作…… 电脑重启之后就变成了这样: 按理说,登录了微软账号之后,Windows系统要进入到桌面就必须有一个输入密码验证的过程,但这个界…

防封!数字人直播防封!铭顺科技AI数智人抖音直播防封落地方案!!

数字人直播防不防封? 数字人直播有没有流量? 数字人直播能不能落地? 这是目前所有想入局AI数字人赛道、想用数字人直播、想做数字人项目的老板们最担心、最关心的问题!但是,同行友商对此都噤若寒蝉,不敢跟…

视频安防监控LntonAIServer安防管理平台抖动检测和过亮过暗检测

随着视频监控技术的发展,视频质量成为确保监控系统有效性的重要因素。LntonAIServer通过引入抖动检测与过亮过暗检测功能,进一步提升了视频监控系统的可靠性和用户体验。这些功能可以帮助及时发现并解决视频流中的质量问题,确保视频监控系统始…

Git撤销add

git要提交版本第一步是add,就算是文件本身已经存在只是修改,也需要添加,即添加到暂存区。其中最偷懒和也保险的命令是: git add . 即添加了本地(多称工作目录)所有文件。 撤销add有以下文章: …