进化算法、遗传编程和学习

一、说明

        进化算法是一系列搜索算法,其灵感来自自然界(达尔文主义)进化过程。所有不同家庭成员的共同点是,通过应用受自然遗传学和自然选择启发的

  •         算子,通过进化出最初
  •         随机的候选解决方案群体来解决问题,以便及时出现更合适(即更好)的问题解决方案。

        该领域的起源可以追溯到 1950 年代和 1960 年代,在过去的二十年中已经独树一帜,证明成功地解决了来自高度多样化领域的众多问题,包括(仅举几例):优化、自动编程、电子电路设计、电信、网络、金融、经济学、图像分析、信号处理、音乐和艺术。

        有趣的是,研究人员——包括我自己——发现进化算法可以以有益的方式与机器学习和深度学习相结合。稍后会详细介绍。

二、遗传算法的结构

        以下是基本的进化算法的样子:

  1. 产生最初的个体群体,后者是手头问题的候选解决方案
  2. 根据寻求解决方案的问题评估每个人的适合性
  3. 终止条件未满足时,选择
    更合适的个体进行繁殖
    重组交叉)个体 - 突变个体

    评估修改个体的适应性

让我们盘点一下进化算法的主要成分:

基因组(染色体)。进化算法本质上是基于群体的。群体中的个体被称为基因组或染色体。它可以采用多种形式,包括位串、实值向量、基于字符的编码、计算机程序等。设计适合手头问题的表示对于进化算法的成功至关重要。

健身,或健身功能。总体中候选解决方案质量的度量。正确定义此函数对于进化算法的成功也至关重要。

一代。上面 while 循环的单次迭代。

选择。进化算法选择(通常是概率上)高适应性个体为下一代贡献遗传(嗯,“遗传”)物质的运算符。

交叉。两种主要遗传算子之一,其中两个(或多个)候选溶液(亲本)以某种预定义的方式组合以形成后代。

突变。第二主要遗传算子,其中一种候选溶液被随机改变。

是时候举一个简单的例子了。让我们考虑一个由 4 个个体组成的群体,它们是长度为 10 的位串(基因组)。适应度值等于
位字符串中的 1 个数。当然,在实际应用中,种群规模和基因组长度更大。

在这种情况下,适应度计算非常简单:只需计算一个人的 1 数量。对于现实世界的问题,我们通常必须执行一些繁重的计算来获得适应度值。

初始随机总体可能如下所示(适应度值在括号中):0000011011 (4)、1110111101 (8)、0010000010 (2)、0011010000 (3)。

然后,选择可以选择作为父对:1110111101 (8) 与0011010000 (3),0000011011 (4) 与1110111101 (8)。请注意,有些人比其他人更容易被选中,而有些人可能根本没有——选择是概率性的,这取决于健康状况。适合度越高,被选为父母的概率就越高。

交叉运算符在一对父级之间交换随机块,然后是随机翻转少量位的突变运算符。

一旦我们完成了选择-交叉-突变,我们就有了新一代。在我们的例子中,它可能看起来像这样:1111010000 (5)、0010101101 (5)、0000011011 (4)、1110111111 (9)。是的,有点这个父母,有点那个父母,有点改变,瞧——一个改进的解决方案,健身 9(而以前最好的是 8)。

现在怎么办?只要继续循环几代人——选择-交叉-突变-适应——直到你得到一个足够好的解决方案。甚至可能是最佳的。

三、遗传算法编程

        现在让我们让事情变得更有趣。为什么要发展简单的位串?进化算法中的主要子领域之一称为遗传编程,它专注于使用更复杂的表示。传统上,这些是计算树,但多年来已经提出了许多其他表示。

        计算树如下所示:

        我通过遗传编程进化了这棵树,它实际上计算(递归)等效的数学表达式:x⁴ + x³ + x² + x + 1。有时进化会产生更复杂的树,例如:

四、机器学习和深度学习

        正如我和其他人在过去几年中发现的那样,进化算法的主要优势之一是它们如何“玩”机器学习和深度学习——如果使用得当的话。

        例如,在机器学习环境中,我设计了许多基于进化的分类器,它们与XGBoost,LightGBM和深度神经网络竞争。以下是全文。

        在深度学习环境中,我们使用了一种所谓的协同进化算法,其中多个种群协同进化,为深度网络进化激活函数。我们没有使用标准的ReLU,sigmoid等,而是将进化的激活函数插入深度网络,并表明它们的性能提高了。以下是全文。

        在对抗性深度学习领域,研究人员调查了深度模型对攻击的脆弱性,既试图改进模型防御,又设计新的攻击。输入图像中的微小变化,我们无法检测到,可能会导致网络出错。

        在一项工作中,我们使用进化来生成物理上合理的对抗性补丁,这些补丁是高性能的,看起来很逼真——没有使用梯度。我们使用了GAN(生成对抗网络)生成器。给定一个预训练的生成器,我们寻找一个输入潜在向量,对应于生成的图像,这会导致对象检测器出错。我们利用潜在空间的(相对)小维度,使用进化策略算法近似梯度,通过查询目标对象检测器反复更新输入潜在向量,直到发现适当的对抗补丁。

        下面见证我才华横溢的研究生拉兹·拉皮德(Raz Lapid)站在他的另一半旁边,展示进化的补丁(打印的,即物理的)如何将他隐藏在深度学习模型(没有边界框)之外。全文在这里。

欢迎您仔细阅读我的网站以获取更多详细信息和完整论文。

开始使用进化算法有多难? 好吧,我会从众多优秀的软件包之一开始。毫不掩饰地,我想推荐我发起的项目 - 以及我出色的合作者和研究生 - EC-KitY

GitHub - EC-KitY/EC-KitY:EC-KitY是一个scikit-learn兼容的Python工具包,用于执行...

EC-KitY是一个用于进行进化计算的Python工具包,它与scikit-learn兼容。目前我们有...

我们对这个项目有多个目标,因此EC-KitY是:

  • 运行进化算法的综合工具包;
  • 用蟒蛇编写;
  • 可以在有或没有scikit-learn的情况下工作,也就是说,它同时支持sklearn和非sklearn模式;
  • 设计时考虑了现代软件工程;
  • 旨在支持所有流行的进化算法范式。

您只需 3 行代码即可运行进化算法:


algo = SimpleEvolution(Subpopulation(SymbolicRegressionEvaluator()))algo.evolve()print(f'algo.execute(x=2,y=3,z=4): {algo.execute(x=2, y=3, z=4)}')

EC-KitY也与scikit-learn兼容,如以下代码片段所示:

X, y = make_regression(n_samples=100, n_features=3)terminal_set = create_terminal_set(X)algo = SimpleEvolution(Subpopulation(creators=FullCreator(terminal_set=terminal_set),evaluator=RegressionEvaluator()))regressor = SKRegressor(algo)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)regressor.fit(X_train, y_train)print('MAE on test set:', mean_absolute_error(y_test, regressor.predict(X_test)))

        让我以查尔斯·达尔文(Charles Darwin)的一句名言来结束——《物种起源》的结束语:

        这种生命观是宏伟的,它有几种力量,最初被呼吸成几种形式或一种形式;而且,虽然这个星球按照固定的万有引力定律循环,但从如此简单的开始,最美丽和最美妙的形式已经并且正在进化。摩西·西珀博士

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

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

相关文章

每日一博 - 闲聊Microservice Architecture

文章目录 概述图解小结 概述 典型微服务架构通常包括以下组件: 负载均衡器(Load Balancer):用于将传入的流量分发到多个API网关实例以提高可用性。 内容分发网络(CDN,Content Delivery Network&#xff0…

MFC中的类继承图的基本框架

一、类继承关系 从图中可知,在MFC中大多数的类都派生于CObject类,它的主要作用是为子类提供一些基本的功能,这些派生类构成了MFC应用程序的基本框架,它们各自的功能描述如表1所示。 派生类 功能描述 CCmdTarget 用于处理用户请…

Python list列表删除元素(4种方法)

在 Python列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法;根据元素本身的值进行删除,可使用列表(list类型)提供的 remove() 方法&#xf…

Pytest系列-数据驱动@pytest.mark.parametrize(7)

简介 unittest 和 pytest参数化对比: pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的 而pytest框架: 前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数&#x…

CLIP 基础模型:从自然语言监督中学习可转移的视觉模型

一、说明 在本文中,我们将介绍CLIP背后的论文(Contrastive Language-I mage Pre-Training)。我们将提取关键概念并分解它们以使其易于理解。此外,还对图像和数据图表进行了注释以澄清疑问。 图片来源: 论文&#xff1a…

Layui + Flask | 实现注册、登录功能(案例篇)(08)

此案例内容比较多,建议滑到最后点击阅读原文,阅读体验更佳。后续也会录制案例视频,将在本周内上传到同名的 b 站账号。 已经看了 layui 表单相关的知识,接下来就可以实现注册功能,功能逻辑如下: 项目创建 新建 flask 项目下载 layui 文件,解压之后复制到指定文件编写前…

前缀和实例4(和可被k整除的子数组)

题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k 5 输出:7 …

系统性能调优:提升服务器响应速度

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

95.qt qml-诺谦通用可扩展多功能QML界面

支持如下所示: 1.可扩展多功能交互,用户可以根据自己喜欢使用常用功能,针对多功能项目非常有用!2.登录用户信息显示,历史消息显示,皮肤黑白风格切换 如下图所示: 自带一个功能界面,可以通过功能界面添加不…

第十三章总结

一.泛型 1.定义泛型类 泛型机制语法&#xff1a; 类名<T> 其中&#xff0c;T是泛型的名称&#xff0c;代表某一种类型。 【例13.6】创建带泛型的图书类 代码&#xff1a; 结果&#xff1a; 2.泛型的常规用法 (1)定义泛型类时声明多个变量 class MyCla…

算法通过村第八关-树(深度优先)青铜笔记|经典算法题目

文章目录 前言1. 二叉树里面的双指针1.1 判断两棵树是否相同1.2 对称二叉树1.3 合并二叉树 2. 路径专题2.1 二叉树的所有路径2.2 路径总和 3. 翻转的妙用总结 前言 提示&#xff1a;人类的底里是悲伤&#xff0c;我们都在用厚重的颜料&#xff0c;覆盖那些粗糙的线稿。--张皓宸…

ros2学习笔记:shell环境变量脚本setup.bash[-z][-n][-f]参数作用

-n作用 [ -n 字符串 ] or [ 字符串 ] 字符串的长度为非零&#xff08;有内容&#xff09;则为真。加-n与不加-n结果相同。 -z作用 [ -z 字符串 ] 字符串的长度为零则为真。 字符串为空即NULL时为真&#xff0c;与上面的-n相反。 -f作用 [ -f FILE ] 如果 FILE 存在且是一…

【C语言】指针和数组笔试题解析(2)

【C语言】指针和数组笔试题解析&#xff08;1&#xff09;&#xff0c; 这是第一篇关于sizeof与strlen在指针中的应用&#xff0c;而这一篇主要讲解在各种情形下的灵活运用&#xff0c;也是大厂中经典的面试题 第一题&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };in…

uniapp 触底加载

方式一 onReachBottomDistance 缺点&#xff1a;需要整个页面滑动&#xff0c;局部滑动触发不了 { // pages.json // 路由下增加 onReachBottomDistance "path": "detailed/detailed","style": {"navigationBarTitleText": "收…

【无公网IP内网穿透】Windows搭建Web站点

什么是cpolar&#xff1f; cpolar是一个非常强大的内网穿透工具&#xff0c;开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口&#xff0c;使得公网用户可以轻松访问您的内网服务器&#xff0c;无需部署至公网服务器。支持永久免费使…

idea 无法识别vue3语法

问题描述&#xff1a; 整合了vue3.js插件能够识别到vue标准语法和html语法第三方库的语法不支持 原因 因为没配置项目根路径&#xff0c;导致无法识别配置文件 而配置文件是识别第三方库语法所必须的。 我用vite操作的&#xff0c;需要这么几个包&#xff1a; 当识别到这…

22.(地图工具篇)geoserver点服务图层SLD样式效果1

地图之家总目录(订阅之前必须详细了解该博客) 效果如下: SLD样式 <?xml version="1.0" encoding="GBK"?> <StyledLayerDescriptor version="1.0.0" xsi:schemaLocation

【Linux网络编程】Socket-UDP实例

这份代码利用下面所有知识编写了一个简易聊天室&#xff08;基于Linux操作系统&#xff09;。虽然字数挺多其实并不复杂&#xff0c;这里如果能够看完或许会对你的知识进行一下串联&#xff0c;这篇文章比较杂并且网络编程这块知识需要用到系统编程的知识&#xff0c;希望能帮助…

Spring Boot集成EasyExcel实现数据导出

在本文中&#xff0c;我们将探讨如何使用Spring Boot集成EasyExcel库来实现数据导出功能。我们将学习如何通过EasyExcel库生成Excel文件&#xff0c;并实现一些高级功能&#xff0c;如支持列下拉和自定义单元格样式&#xff0c;自适应列宽、行高&#xff0c;动态表头 &#xff…

Open3D 点云配准——可视化匹配点对之间的连线

点云配准 一、算法原理1、概述2、主要函数二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、概述 可视化源点云和目标点云中匹配点对之间的连线,这对于点云配准,尤…