当前位置: 首页 > news >正文

粒子群优化

原文:towardsdatascience.com/particle-swarm-optimization-b869231c57fe

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f40eef1690bc8cb84e9abd82280e7db3.png

由 James Wainscoat 在 Unsplash 拍摄的照片

无论我们处理的是机器学习、运筹学还是其他数值领域,我们都必须完成的共同任务是优化函数。根据领域不同,一些常用的方法应运而生:

  • 在机器学习中,当训练神经网络时,我们通常使用梯度下降法。这是因为我们处理的是可微分的函数(至少在几乎所有的点上都是可微分的 – 见 ReLU)。

  • 在运筹学中,我们经常处理可以用线性(或凸)规划解决的线性(或凸)优化问题。

如果我们能应用这些方法,那总是很棒的。然而,对于优化一般函数,即所谓的黑盒优化,我们必须求助于其他技术。其中特别有趣的一种是所谓的粒子群优化,在这篇文章中,我将向你展示它是如何工作的以及如何实现它。

注意,这些算法并不总是给出最佳解,因为它们是高度随机和启发式算法。尽管如此,它仍然是你工具箱中的一个很好的技术,当你遇到难以优化的函数时,你应该尝试使用它!

在 1995 年,Kennedy 和 Eberhart 在他们同名的论文中介绍了粒子群优化。作者从社会生物学中找到了类比,提出集体运动,如鸟群,可以让每个成员从整个群体的经验中受益。我们将在下一部分看到这意味着什么。

让我们假设你想最小化一个二维变量的函数,例如,f(x,y) = _x_² + _y_²。当然,我们知道解是 (0, 0),值为 0,我们的算法也应该找到这个解。如果我们连这一点都做不到,我们就知道我们完全做错了。

静态粒子

我们首先随机初始化大量潜在解,即二维点 (xᵢ,yᵢ),其中i= 1, …,N。这些点被称为粒子(鸟类),点的集合是群体(鸟群)。对于每个粒子 (xᵢ,yᵢ),我们可以计算函数值f(xᵢ,yᵢ)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/09bf6773d3b821de1b4ff6de4a465f27.png

中间的红色十字是我们要尝试找到的最小值。在白色中,你可以看到 100 个随机点。图片由作者提供。

我们可以在这里停止,并输出具有最低f值的粒子。这将是一个随机搜索,在低维度中可能有效,但在高维度中通常效果较差。

推动它们!

但我们不想就此止步!相反,我们通过给每个粒子一个随机的轻微推动来启动一个动态系统。粒子应该直线飞行,就像在无重力的外太空一样。我们可以检查几个时间步长内所有粒子的位置,然后报告我们见过的最低的f值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5db955afe2034620fff2c8d9aa5f47b4.png

每个粒子都会在某个方向上受到推动。它们将永远跟随这个方向。图片由作者提供。

这基本上是一个随机搜索,但我们稍微改变一下随机点,这样它们就可以四处飞翔,为我们提供更广泛的搜索空间。你可以这样实现:

deff(x):# function to minimizereturnx[0]**2+x[1]**2defeasy_push(dimension,swarm_size,n_steps):x=np.random.normal(loc=0,scale=3,size=(dimension,swarm_size))# initial swarmv=np.random.normal(loc=0,scale=1,size=(dimension,swarm_size))# initial velocities (directions)best_position=x[:,[f(x).argmin()]]best_value=f(x).min()forstepinrange(n_steps):x=x+v# update positions according to the push directionnew_candidate=f(x).min()ifnew_candidate<best_value:best_value=new_candidate best_position=x[:,[f(x).argmin()]]returnbest_positionprint(easy_push(dimension=2,swarm_size=100,n_steps=100))# use function

在矩阵x中,每一列是粒子的位置。同样,其他矩阵v的每一列代表具有相同索引的相应粒子的方向向量。代码高度向量化,因此性能更好。否则,我们不得不在群体中的所有粒子上写一个 for 循环。

虽然这比随机搜索要好一些,但粒子仍然相当愚蠢——它们只沿直线移动,我们只能希望其中之一能接近最小值。

所以到目前为止,还没有形成群体。只是一群自私的鸟直线飞行,做它们的事情。

添加吸引力

粒子群优化有很多变体,但在每个变体中,粒子都变得更聪明一些:

  1. 它们获得了一种记忆:每个粒子都知道迄今为止它找到的最佳位置。

  2. 它们意识到群体:每个粒子都知道迄今为止任何粒子找到的最佳位置。

现在,高级思想是粒子不仅直线飞行,而且朝向

  1. 它们已知的最著名的位置——局部最佳位置——,但还

  2. 群体最著名的地点——全局最佳位置

你可以通过在每一步改变方向来实现这个想法。在代码中,之前的方向v在循环的每次迭代中保持不变。我们只设置一次,然后更新x = x + v。现在,我们想更新v,例如使用以下公式:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/11558b1640aae5412bdd55ad452ef21c.png

方向改变公式。图片由作者提供。

用话来说:下一时间步的方向由三个组成部分组成:

  1. 一个缩放(通常是更短,即,0 <w< 1)的旧方向,

  2. 一个认知方向,指向每个粒子迄今为止找到的局部最佳解,以及

  3. 一个社会方向,指向整个群体迄今为止找到的全局最佳解。

这意味着每个粒子会随着时间的推移而减速,移动到它曾经见过的最佳解,同时也移动到群体曾经见过的最佳解。

你也可以这样表达:每个粒子被它自己曾经见过的最佳位置吸引,同时也被全局最佳位置吸引。最终,我们的粒子将表现出这样的行为:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/339a3ffbf0aefe5b382e6f5511a62e19.png

粒子移动到它们自己已知最佳位置,同时也移动到群体已知最佳位置。图片由作者提供。

这里是优化二维中更困难的Rastrigin 函数的另一个动画:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/037bd864e22cec2f3f059f2bae02ad4b.png

图片由作者提供。

这个函数有许多局部最小值,这是训练神经网络时常见的问题。尽管如此,我们的简单算法在这里似乎效果很好。一些粒子卡在了错误的局部最小值中,但许多粒子也聚集在中间的全局最小值周围,这对于得到好的结果已经足够了。

实现

这看起来很复杂,但如果已经理解了自私的鸟类的代码,代码本身也很简单。下面是代码:

defsimple_pso(dimension,swarm_size,n_steps,w,c_cognitive,c_social):x=np.random.normal(loc=0,scale=3,size=(dimension,swarm_size))v=np.random.normal(loc=0,scale=1,size=(dimension,swarm_size))best_position_particle=x# in the beginning, the best position known for each article is its initial positionforstepinrange(n_steps):best_value_particle=f(best_position_particle)# the corresponding function values for the best known positionsbest_position_global=x[:,[best_value_particle.argmin()]]# global best position that attracts all particlesr=np.random.random(2)# this is new, see belowx=x+v# same as beforev=w*v+c_cognitive*r[0]*(best_position_particle-x)+c_social*r[1]*(best_position_global-x)# the direction change formulaimprovement=f(x)<=best_value_particle best_position_particle[:,improvement]=x[:,improvement]# update each particle's locally best solutionbest_position_global=x[:,[best_value_particle.argmin()]]returnbest_position_globalprint(simple_pso(dimension=2,swarm_size=100,n_steps=100,w=0.8,c_cognitive=0.1,c_social=0.1))

更多随机性

注意,我在代码中引入了另一个随机性的来源。不是使用上面的方向改变公式,而是使用

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/46146ec3040d2c73501f503bda5c52ee.png

修改后的方向改变公式。图片由作者提供。

其中 _r_₁ 和 _r_₂ 是介于 0 和 1 之间的随机数。你也可以使用矩阵,而不仅仅是单个数字,但让我们保持简单。许多作者使用这种额外的随机性形式,但我无法理解为什么是这样。如果你知道,请给我留言!

结论

在这篇文章中,我们看到了如何实现粒子群优化的一种简单形式。与其他受自然界启发的算法,如进化算法一样,该算法是启发式的,并不保证找到函数的全局最优解。然而,在实践中,结果可以非常出色。

算法首先散布一堆粒子,给它们一点推动,并让它们相互交互。这导致了一个看似复杂的动态系统,幸运的是,这个系统可以用公式轻松描述。

扩散粒子!

一个警告:如果你的粒子在开始时没有足够分散,算法可能会失败得很惨。在下面的图片中,所有粒子的初始位置都远离中间的真实全局最小值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8d71bd067e678d515338838de40d4236.png

不良初始化导致不良解。图片由作者提供。

可能存在改进我们算法以处理此类情况的方法,但我建议尽可能分散粒子,这样您搜索的最小值很可能位于您的初始群体内。


我希望您今天学到了一些新的、有趣且有价值的东西。感谢阅读!

如果您有任何问题,请通过LinkedIn联系我!

如果您想更深入地探索算法的世界,可以尝试我的新书《All About Algorithms》!我仍在寻找作者!

All About Algorithms

http://www.jsqmd.com/news/373273/

相关文章:

  • OpenEuler安装MiniConda
  • go语言实现http双向认证
  • 微服务架构在 C++ 和 Python中的应用
  • 【JAVA 进阶】深入探索Spring AOP:从原理到实战 - 指南
  • 2026年河北环卫公司推荐:行业先锋综合评估报告发布 - 品牌推荐
  • AI4Science开源数据汇总
  • ML.NET 作为 .NET 生态的轻量级机器学习框架,在**异常检测**(Anomaly Detection)领域提供了几类高级算法,尤其适合工控机边缘部署
  • 2026年知名的项目综合管理,项目组合管理系统,项目集管理公司用户好评名录 - 品牌鉴赏师
  • 超越PCA:设计可扩展、可解释的现代降维算法组件
  • Java小白互联网大厂面试场景:从Spring Boot到微服务架构的问答解析
  • Teamcenter用户登录失败或模块访问被拒的深度原因分析与解决
  • 2026年河北环卫公司推荐榜单:覆盖多场景服务、90%客户满意率的五强权威认证 - 品牌推荐
  • Ubuntu 24.04 设置开机自动启动命令
  • AI写论文风向标!4个热门AI论文生成工具,写论文不再是烦恼!
  • AI写论文有妙招!4款AI论文生成工具,帮你快速搞定毕业论文!
  • 2026年河北环卫公司推荐榜单:覆盖城乡一体化、智慧化转型需求的五强权威认证 - 品牌推荐
  • 《P2513 [HAOI2009] 逆序对数列》
  • 微信Linux版QVD-2026-7687漏洞深度复现:点击即执行,漏洞原理、验证方法与防御指南
  • AI写论文的绝佳选择!4款AI论文写作神器,让论文创作事半功倍!
  • 英伟达红队重磅发布:AI Agent安全实践指南,筑牢执行层安全防线
  • 88 并发工具类综合应用
  • 86 线程安全问题排查
  • 小班不小众,提分更提效——七星教育领跑合肥初高中精细化辅导赛道 - 品牌企业推荐师(官方)
  • 致命零信任漏洞:CVE-2025-59287深度剖析——WSUS不安全反序列化如何沦为内网渗透突破口
  • 专业的液体磷肥供应商生产厂家 - 品牌企业推荐师(官方)
  • 87 ForkJoinPool框架深度剖析
  • 潜伏的IRC控制军团:SSHStalker僵尸网络技术解析与防御前瞻
  • 什么是赫布原理(Hebbian principle / Hebbs rule)?
  • Windows 记事本(CVE-2026-20841)漏洞深度剖析——点击即沦陷,远程代码执行风险逼近
  • 2026最新江西家政服务推荐:月嫂、育儿嫂、护理老人、住家保姆、不住家保姆优质服务商榜单 - 品牌企业推荐师(官方)