2026/1/10 15:39:22
网站建设
项目流程
重庆市城市建设档案馆官方网站,做自媒体在哪个网站好,空间设计说明,湛江网上房地产原文#xff1a;towardsdatascience.com/hands-on-optimization-using-genetic-algorithms-with-python-bb7970dbbf0a 你听说过这个销售策略吗#xff1f; “你在 X 上浪费了几个小时吗#xff1f;为什么不试试 Y#xff1f;” 我确信你做到了。例如#xff1a;“不要花几…原文towardsdatascience.com/hands-on-optimization-using-genetic-algorithms-with-python-bb7970dbbf0a你听说过这个销售策略吗“你在 X 上浪费了几个小时吗为什么不试试 Y”我确信你做到了。例如“不要花几个小时编写自己的代码用我们的软件代替”或者“停止浪费几个小时在你的广告上用 AI 代替”我的 YouTube 推荐算法喜欢这个可能是因为我总是谈论 AI。这个销售策略基于这样一个事实即你花在想要解决的问题上的时间可以被优化。“用点学术语言来说”当你阅读这个销售策略时你通常有两个选择探索或利用。我这是什么意思我稍后会解释。现在记住这个销售策略把它放在你脑后。我们回头再谈。假设你有一个工具一个可以调整的旋钮。通过移动这个旋钮你得到一个等待时间。想象一下你在星巴克的咖啡队列中旋钮有两个状态0 和 10 可能意味着“留在同一个队列”而 1 可能是“换一个队列”。哪一个意味着“等待时间最少”你应该换队列还是耐心等待同一个队列我知道你至少遇到过这个问题一次。我是一个大换队人而我的妻子是一个大留队者。现在让我们考虑一个可以连续移动的旋钮这意味着你在 0 和 1 之间有无限的状态如果你愿意可以想象很多“线条”。让我们称这个状态为x。从数学的角度来说我们的问题有x状态和y等待时间https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/54d22bfe8ab26a1b67ad07f388672b42.png作者制作的照片假设我们有状态0.2、0.4、0.6 和 0.8。对于这些状态我们找到了相应的等待时间。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eb2183da0c9b3eaa2bbe5abdeb21a555.png作者制作的照片现在考虑到这 4 个点我们可以说最低的等待时间是在状态 x0.4。但我们能确定这真的是最短的时间吗我们不知道但我们只有 4 个点所以我们高度怀疑我们已经找到了最短的时间特别是考虑到 0.0 和 0.2 之间以及 0.8 和 1 之间的区域完全未被探索。我们能做什么我们探索其他区域在 0 和 0.2 之间以及 0.8 和 1 之间。我们利用我们认为最小值可能存在的区域在 0.2 和 0.6 之间你还记得那个销售策略的例子吗这相当于这样做我们信任销售人员并探索未探索的区域我们改变我们之前的行为看看未探索的部分会发生什么。例如我们购买他们试图销售的软件并放弃我们的编码。我们不信任销售人员并利用我们所知道的信息我们深入挖掘并细化我们的估计。我们不购买他们的软件并提高我们自己的编码技能。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b61e4c0db1e5ab54312d296ce15da102.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/52869a3c4e0c69b3f89e4fc9a7e74a95.png现在做两者会很好对吧最好不是 100%信任销售人员而是 0%信任自己而是同时进行探索和利用。例如你支付他告诉你的 20%对于你不想处理的最难的部分而你自己处理你想要处理的脏活节省金钱。有时候情况很混乱故事比一个试图卖软件的人更复杂这就是遗传算法GAs的用武之地。遗传算法是一种通常在考虑探索和利用方面都做得很好的优化方法。遗传算法的根源在于生物学我发现这种方法非常迷人且强大。在这篇博客文章中我们将做以下事情我们将非常简要地定义遗传算法试图解决的问题优化和全局最优我们将从理论角度描述遗传算法。我们将把遗传算法应用于一个多极值情况。好吧有很多东西要讲。准备好了吗让我们开始吧。0. 优化思想我们在介绍中已经稍微涉及了一些优化思想这里不需要用复杂的数学。我只是想稍微形式化一下问题这样我们就能在整个文章中理解我们在谈论什么。一切都从你的参数开始。回到旋钮的例子假设你不止有一个旋钮而是有多个。假设你有 k 个。这些就是你的参数。你的参数形成一个向量或者如果你喜欢计算机就是一个列表用x表示https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b61e4c0db1e5ab54312d296ce15da102.png由作者制作的照片对于你给我的每一个x我会给你相应的损失或成本。损失用字母L表示。遗传算法的目标是使这个损失最小化使其尽可能小。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0f0db7560a5f252823985d2ef088ce1d.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/52869a3c4e0c69b3f89e4fc9a7e74a95.png其中 X 是你的“解空间”由参数 1、参数 2、……、参数 k 的整个边界表示。好的。这就是我要说的闲话了。现在让我们具体谈谈遗传算法。1. 遗传算法理论1.1 定义一个种群现在你还记得我承诺过我们要探索和利用吗为了探索我们首先要用 N 个元素填充 X。这将确保我们有一个平等的机会去“看到”或探索一切而不会错过可能的最佳“位置”。遗传算法 的想法来源于生物学因此你将看到很多生物学术语。原始的随机样本被称为 “种群”。种群会随着时间t的推移而进化因此我们将它定义为 P(t)。种群有m个元素这些元素被称为染色体。因此这是我们第一个种群https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3e27d1476cc8b9f511e4eb0436486a1a.png由作者制作的照片正如我们所说的P(0) 的元素是从 k 维参数空间中随机采样得到的。如果你注意到我们的参数向量x成为了一个函数那是因为当我们在寻找最优解时这个向量会随着时间而进化。1.2 选择过程因此这是我们第一个候选列表。从这个列表中我们 already 可以看出哪个更好哪个更差对吧例如如果 m 50我们可能会有 L(x(0)_30)L(x(0)_20)这意味着第 30 个染色体比第 20 个染色体具有更低的损失。这是我们开始的地方。我们如何改进首先我们要选择最好的那些即更有可能成为最小值的那些。在数学上“最好的那些”意味着“最大化适应度函数的那些”。在最小化的情况下适应度函数定义为f(x) -L(x)。因此再次强调在时间 0 时适应度函数将给出以下值https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2bec73de033c3c3286f262998e1b0988.png由作者制作的照片现在我们如何使用这个适应度函数来选择 “最好的那些” 呢我们可以简单地选择“适应度值最大的那个”这非常直观。然而实现这一目标的一种最好的方式是进行“轮盘赌选择”这意味着以与适应度函数成比例的概率提取它们。这意味着在时间 t0 时提取第 i 个染色体的概率是https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0aa2fe41e5efedc0dd6da79178d183f6.png由作者制作的照片这种方法很稳健如果你只有一个染色体概率是 1因为你没有其他选择。因此根据上述定义的概率我们开始选择km 个染色体我们将它们称为父母原因你将在下一秒知道**。** 这些父母是随机选择的但它们很可能是具有良好适应度值的元素因为我们定义了概率。1.3 父亲和孩子现在遗传算法是进化算法的一部分这意味着步骤 t 是步骤 t-1 的进化如果你愿意的话是改进。那么我们如何进化呢不幸的是它不像宝可梦你实际上需要至少两个“父母”来生成一个“孩子”也称为“后代”。候选“父母”是我们在例如使用上述轮盘赌选择中选择的 k 个候选者。你需要生成与原始种群相同数量的后代m。你可以通过多种方式选择一对父母。你可以随机选择他们或者从第一个父母开始并与所有其他父母“配对”。然后使用第二个父母并与剩余的其他父母“配对”以此类推直到你达到“m”个后代。但我们如何结合两个父母呢我们通过应用一种称为交叉的技术来实现。我们选择索引 k然后从该索引开始混合就像你在下面的方案中看到的那样https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8fdd78ab61ef333702e0da0f473d97b1.png作者制作的照片这个想法有两个原则试图从两个父母中获取最佳品质我们的目标是获取使父母 P 成为良好适应染色体品质的品质以及使父母 Q 成为良好适应染色体品质的品质并将它们混合。探索新区域从几何学的角度来说通过这样做你正在积极探索新区域。这是探索与利用的核心这也是为什么进化方法在历史上被认为在这两种期望效果之间有很好的权衡。通过这样重复 m 次我们将得到 m 个后代。这些后代构成了新的种群我们将在时间 t 时称这个新的后代集合为https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/75b8457514980dba33442c08936e1f96.png作者制作的照片因此让我们回顾一下到目前为止我们所做的一切我们随机地选择了样本我们使用适应度函数作为概率指示器来采样父母候选者列表我们从候选人的名单中选择了父母并将他们配对我们从每一对中生成一个后代从而增强了最小值的探索和利用。美丽。我们几乎就要完成了我保证。1.4 突变现在下一步是突变我们的后代。我的意思是我们想要添加某种随机性这意味着我们不一定希望 x(t)只是 x(t-1)的混合我们希望它不同。如果你这么想在生活中你不仅仅是遗传混合的结果你也是随机性的结果你周围发生的事情如何改变你。抛开哲学不谈这是你添加突变的方法https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2e386bfddb24377bbb00d8bedc064836.png作者制作的照片这允许你探索xs 的不同实现同时你也在利用你最佳最大值或最小值的周围环境。记住这将给我们 m 个元素因为 X(t)是一个有 m 行的矩阵所以你的种群已经准备好进行 t1 步。1.5 停止标准我们何时停止这个过程有多种方法可以做到这一点。第一种方法就是设置迭代次数。例如t*max 10经过 10 次改进后你停止在 P(10)处。或者你可以将适应度作为参考当从时间 t 到时间 t1 的适应度没有足够增加或者它达到一定阈值时你停止优化。无论你的标准是什么如果未满足标准你重新执行步骤 1.2–1.4如果满足了标准你就停止。2. 遗传算法实现现在这个流程在实践中相当简单随机选择种群通过交叉和变异改进它如果满足停止标准就停止。令人惊讶的是在实践中实现它甚至更简单。让我们一步步来看。2.1 库PyGAD是一个库它让你可以完全控制参数种群大小、父代数量、停止标准等等但它也非常易于使用。让我公平地说遗传算法的数学并不复杂你可以使用面向对象编程从头开始开发它。然而为了简单和效率我们将使用 PyGAD 实现。让我们使用以下命令安装它pip install pygad这个库还提供了非常酷的集成例如他们使用 GA 训练神经网络这非常有趣。2.2 参数根据你的最佳需求调整遗传算法所谓的超参数调整过程本身就是一门艺术。这里有那么多你可以改变的事情以找到比刚刚找到的更小的最小值并改进你的结果。所有可能的参数列表可以在这里找到。让我给你一个想法fitness_func和gene_space它们非常重要因为它们是适应度函数你定义的“最佳解”和你要寻找的空间边界keep_parents这是一个很酷的功能它给你提供了在种群 P(t1)中保留父代的选项这样你不仅只有后代还保留了父代以供下一次迭代。parent_selection_type有多种方法可以从种群中选择父代。上面我们描述了“轮盘赌选择”但还有像“稳态选择”或“随机均匀选择”这样的方法。这个参数允许你修改这个方法mutation_type: “突变”你的种群有多种方式。我们讨论了“随机”但也有“交换”或“反转”。crossover_type: 进行“交叉”操作也有多种方式。我们描述了“单点”我们称之为 k但你也可以应用“两点”或“均匀”交叉策略来组合基因。再次强调这远非完整的列表因为你可以调整的参数有很多。但这是一件好事**调整参数是调整你的遗传算法以找到最佳最优解并收敛到全局最优解的方法。2.3 代码整个故事可以总结为一块代码。我将给你代码然后我们将讨论它。cdn.embedly.com/widgets/media.html?srchttps%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fgenetic-algorithm%2Fv%2F7%26cellId%3D1dntp1display_nameJovianurlhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fgenetic-algorithm%2Fv%2F7%26cellId%3D1keya19fcc184b9711e1b4764040d3dc5c07typetext%2Fhtmlscrollautoschemajovian这就是我们所做的事情定义了我们的适应度函数即“减去我们试图优化的函数”。如果你试图优化的函数是一个黑盒可能来自复杂的模型或其他东西根据定义适应度仍然是减去那个函数。设置参数如“m”种群大小、“num_generations”你进行的循环改进次数或“num_genes”即你的输入的维度。我们将这些参数作为输入传递给遗传算法实例。我们通过执行 ga_instance.run()来运行优化。2.3 应用我不想过多关注结果但为了展示它确实有效我将展示它们的样子。如果你成功运行了前面的代码ga_instance.solutions 将是一个 kD x N 矩阵其中k 是输入的维度N 是迭代次数。我们可以绘制这个矩阵来跟踪我们的遗传算法是如何优化我们的函数的cdn.embedly.com/widgets/media.html?srchttps%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttp%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fgenetic-algorithm%2Fv%2F9%26cellId%3D2dntp1display_nameJovianurlhttp%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fgenetic-algorithm%2Fv%2F9%26cellId%3D2keya19fcc184b9711e1b4764040d3dc5c07typetext%2Fhtmlscrollautoschemajovian在这个例子中我们试图最小化二维中 x 和 y 的奇异函数我们可以看到 GA 是如何正确猜测最小面积的即使存在多个局部最小值。但再次强调这篇博客文章的重点是描述如何使用 GA 以及如何使用 PyGAD 来解决你自己的优化任务所以请绝对自由地更改适应度/损失函数以及所有其他参数。3. 结论感谢您与我同行希望这篇文章是对您时间的良好利用 在这篇文章中我们探讨了遗传算法是如何从理论到实践工作的。以下是亮点我们讨论了局部与全局****最优解以及探索与利用问题我们逐步描述了遗传算法的理论。我们讨论了PyGAD对遗传算法的实现强调了设置这个库提供的广泛参数的重要性因为存在多种遗传算法变体我们在一个玩具多最小值示例上展示了结果突出了这种方法是如何正确迁移到最低最小值全局最小值区域的。4. 关于我再次感谢您抽出宝贵时间。这对我们意义重大 ❤我的名字是 Piero Paialunga我就是这里这个人https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9bb6bb0ed5340cc448765190883769a4.png由作者制作的照片我是在辛辛那提大学航空航天工程系的博士候选人同时也是 Gen Nine 的机器学习工程师。我在博客文章和领英上谈论人工智能和机器学习。如果你喜欢这篇文章并想了解更多关于机器学习的内容以及跟随我的研究你可以如果你想向我提问或开始合作请在这里或**领英**上留言点击这里