主板HAO-GT3放在现在是什么样的存在,请尽量说的干一点

现身说法用通俗易懂的语言对遺传算法作了一个全面而扼要的概述,并列举了其在多个领域的实际应用其中重点介绍了遗传算法的数据科学应用。机器之心对该文进荇了编译原文链接请见文末。

几天前我着手解决一个实际问题——大型超市销售问题。在使用了几个简单模型做了一些特征工程之后我在排行榜上名列第 219 名。

虽然结果不错但是我还是想做得更好。于是我开始研究可以提高分数的优化方法。结果我果然找到了一个它叫遗传算法。在把它应用到超市销售问题之后最终我的分数在排行榜上一下跃居前列。

没错仅靠遗传算法我就从 219 名直接跳到 15 名,厲害吧!相信阅读完本篇文章后你也可以很自如地应用遗传算法,而且会发现当把它用到你自己正在处理的问题时,效果也会有很大提升

1、遗传算法理论的由来

1、遗传算法理论的由来

我们先从查尔斯·达尔文的一句名言开始:

能够生存下来的往往不是最强大的物种,吔不是最聪明的物种而是最能适应环境的物种。

你也许在想:这句话和遗传算法有什么关系其实遗传算法的整个概念就基于这句话。

讓我们用一个基本例子来解释 :

我们先假设一个情景现在你是一国之王,为了让你的国家免于灾祸你实施了一套法案:

  • 你选出所有的恏人,要求其通过生育来扩大国民数量
  • 这个过程持续进行了几代。
  • 你将发现你已经有了一整群的好人。

这个例子虽然不太可能但是峩用它是想帮助你理解概念。也就是说我们改变了输入值(比如:人口),就可以获得更好的输出值(比如:更好的国家)现在,我假定你已经对这个概念有了大致理解认为遗传算法的含义应该和生物学有关系。那么我们就快速地看一些小概念这样便可以将其联系起来理解。

相信你还记得这句话:「细胞是所有生物的基石」由此可知,在一个生物的任何一个细胞中都有着相同的一套染色体。所謂染色体就是指由 DNA 组成的聚合体。

传统上看这些染色体可以被由数字 0 和 1 组成的字符串表达出来。

一条染色体由基因组成这些基因其實就是组成 DNA 的基本结构,DNA 上的每个基因都编码了一个独特的性状比如,头发或者眼睛的颜色希望你在继续阅读之前先回忆一下这里提箌的生物学概念。结束了这部分现在我们来看看所谓遗传算法实际上指的是什么?

首先我们回到前面讨论的那个例子并总结一下我们莋过的事情。

  1. 首先我们设定好了国民的初始人群大小。
  2. 然后我们定义了一个函数,用它来区分好人和坏人
  3. 再次,我们选择出好人並让他们繁殖自己的后代。
  4. 最后这些后代们从原来的国民中替代了部分坏人,并不断重复这一过程

遗传算法实际上就是这样工作的,吔就是说它基本上尽力地在某种程度上模拟进化的过程。

因此为了形式化定义一个遗传算法,我们可以将它看作一个优化方法它可鉯尝试找出某些输入,凭借这些输入我们便可以得到最佳的输出值或者是结果遗传算法的工作方式也源自于生物学,具体流程见下图:

那么现在我们来逐步理解一下整个流程

为了让讲解更为简便,我们先来理解一下著名的组合优化问题「背包问题」如果你还不太懂,這里有一个我的解释版本

比如,你准备要去野游 1 个月但是你只能背一个限重 30 公斤的背包。现在你有不同的必需物品它们每一个都有洎己的「生存点数」(具体在下表中已给出)。因此你的目标是在有限的背包重量下,最大化你的「生存点数」

这里我们用遗传算法來解决这个背包问题。第一步是定义我们的总体总体中包含了个体,每个个体都有一套自己的染色体

我们知道,染色体可表达为 2 进制數串在这个问题中,1 代表接下来位置的基因存在0 意味着丢失。(译者注:作者这里借用染色体、基因来解决前面的背包问题所以特萣位置上的基因代表了上方背包问题表格中的物品,比如第一个位置上是 Sleeping Bag那么此时反映在染色体的『基因』位置就是该染色体的第一个『基因』。)

现在我们将图中的 4 条染色体看作我们的总体初始值。

接下来让我们来计算一下前两条染色体的适应度分数。对于 A1 染色体 [100110] 洏言有:

对于这个问题,我们认为当染色体包含更多生存分数时,也就意味着它的适应性更强

因此,由图可知染色体 1 适应性强于染色体 2。

现在我们可以开始从总体中选择适合的染色体,来让它们互相『交配』产生自己的下一代了。这个是进行选择操作的大致想法但是这样将会导致染色体在几代之后相互差异减小,失去了多样性因此,我们一般会进行「轮盘赌选择法」(Roulette Wheel Selection method)

想象有一个轮盘,现在我们将它分割成 m 个部分这里的 m 代表我们总体中染色体的个数。每条染色体在轮盘上占有的区域面积将根据适应度分数成比例表达絀来

基于上图中的值,我们建立如下「轮盘」

现在,这个轮盘开始旋转我们将被图中固定的指针(fixed point)指到的那片区域选为第一个亲夲。然后对于第二个亲本,我们进行同样的操作有时候我们也会在途中标注两个固定指针,如下图:

通过这种方法我们可以在一轮Φ就获得两个亲本。我们将这种方法成为「随机普遍选择法」(Stochastic Universal Selection method)

在上一个步骤中,我们已经选择出了可以产生后代的亲本染色体那麼用生物学的话说,所谓「交叉」其实就是指的繁殖。现在我们来对染色体 1 和 4(在上一个步骤中选出来的)进行「交叉」见下图:

这昰交叉最基本的形式,我们称其为「单点交叉」这里我们随机选择一个交叉点,然后将交叉点前后的染色体部分进行染色体间的交叉對调,于是就产生了新的后代

如果你设置两个交叉点,那么这种方法被成为「多点交叉」见下图:

如果现在我们从生物学的角度来看這个问题,那么请问:由上述过程产生的后代是否有和其父母一样的性状呢答案是否。在后代的生长过程中它们体内的基因会发生一些变化,使得它们与父母不同这个过程我们称为「变异」,它可以被定义为染色体上发生的随机变化正是因为变异,种群中才会存在哆样性

下图为变异的一个简单示例:

变异完成之后,我们就得到了新为个体进化也就完成了,整个过程如下图:

在进行完一轮「遗传變异」之后我们用适应度函数对这些新的后代进行验证,如果函数判定它们适应度足够那么就会用它们从总体中替代掉那些适应度不夠的染色体。这里有个问题我们最终应该以什么标准来判断后代达到了最佳适应度水平呢?

一般来说有如下几个终止条件:

  1. 在进行 X 次迭代之后,总体没有什么太大改变
  2. 我们事先为算法定义好了进化的次数。
  3. 当我们的适应度函数已经达到了预先定义的值

好了,现在我假设你已基本理解了遗传算法的要领那么现在让我们用它在数据科学的场景中应用一番。

试想一下每当你参加一个数据科学比赛你会鼡什么方法来挑选那些对你目标变量的预测来说很重要的特征呢?你经常会对模型中特征的重要性进行一番判断然后手动设定一个阈值,选择出其重要性高于这个阈值的特征

那么,有没有什么方法可以更好地处理这个问题呢其实处理特征选取任务最先进的算法之一就昰遗传算法。

我们前面处理背包问题的方法可以完全应用到这里现在,我们还是先从建立「染色体」总体开始这里的染色体依旧是二進制数串,「1」表示模型包含了该特征「0 表示模型排除了该特征」。

不过有一个不同之处,即我们的适应度函数需要改变一下这里嘚适应度函数应该是这次比赛的的精度的标准。也就是说如果染色体的预测值越精准,那么就可以说它的适应度更高

现在我假设你已經对这个方法有点一概念了。下面我不会马上讲解这个问题的解决过程而是让我们先来用 TPOT 库去实现它。

这个部分相信是你在一开始读本攵时心里最终想实现的那个目标即:实现。那么首先我们来快速浏览一下 TPOT 库(Tree-based Pipeline Optimisation Technique树形传递优化技术),该库基于 scikit-learn 库建立下图为一个基夲的传递结构。

图中的灰色区域用 TPOT 库实现了自动处理实现该部分的自动处理需要用到遗传算法。

我们这里不深入讲解而是直接应用它。为了能够使用 TPOT 库你需要先安装一些 TPOT 建立于其上的 python原理 库。下面我们快速安装它们:

如果你提交了这个 csv那么你会发现我一开始保证的那些还没有完全实现。那是不是我在骗你们呢当然不是。实际上TPOT 库有一个简单的规则。如果你不运行 TPOT 太久那么它就不会为你的问题找出最可能传递方式。

所以你得增加进化的代数,拿杯咖啡出去走一遭其它的交给 TPOT 就行。此外你也可以用这个库来处理分类问题。進一步内容可以参考这个文档:

遗传算法在真实世界中有很多应用这里我列了部分有趣的场景,但是由于篇幅限制我不会逐一详细介紹。

工程设计非常依赖计算机建模以及模拟这样才能让设计周期过程即快又经济。遗传算法在这里可以进行优化并给出一个很好的结果

这是一个非常著名的问题,它已被很多贸易公司用来让运输更省时、经济解决这个问题也要用到遗传算法。

遗传算法在机器人领域中嘚应用非常广泛实际上,目前人们正在用遗传算法来创造可以像人类一样行动的自主学习机器人其执行的任务可以是做饭、洗衣服等等。

希望通过本文介绍你现在已经对遗传算法有了足够的理解,而且也会用 TPOT 库来实现它了但是如果你不亲身实践,本文的知识也是非瑺有限的

所以,请各位读者朋友一定要在无论是数据科学比赛或是生活中尝试自己去实现它

通过分析登陆流程并使用 python原理 实現模拟登陆到一个实验提供的网站在实验过程中将学习并实践 python原理 的网络编程,python原理 实现模拟登陆的方法使用 Firefox 抓包分析插件分析网络數据包等知识。

模拟登录可以帮助用户自动化完成很多操作在不同场合下有不同的用处,无论是自动化一些日常的繁琐操作还是用于爬蟲都是一项很实用的技能本课程通过 Firefox 和 python原理 来实现,环境要求如下:

首先安装demo依赖的web框架django并测试是否安装成功:

要通过编程实现登录,首先需要理解一般Web应用的登陆过程

为什么是2个请求而不是1个呢?通过分析登录请求发现,登陆成功之后服务器发送了302重定向响应服务器要求浏览器重新请求首页,这就产生了第二个请求再来分析第二个请求,可以看到它相比登录请求多了一个请求头:

整个登录流程如丅图所示:

服务器到底是如何区别不同用户的session的为什么登陆成功会后要回写cookie呢?

对于服务器来说登录=验证+写session。对于浏览器来说登录=發送登录信息+获取带sessionid的cookie。可以说只要获得了sessionid,就算实现了模拟登录有了它我们便可以游离于系统之中。

三、使用python原理实现登录(简单实唎)

理解了登录过程的原理和细节之后开始用python原理来编写模拟登陆程序吧。

不要忘记编写文件头、导入必要的依赖模块

登录请求的实体部汾如下:

Web 应用的资源都是有url的只要获得了url就能够在任何地方引用。听起来很方便但这可能会导致你的资源被别人盗用。

在我们模拟登錄成功后就可以直接通过opener打开这个url来使用这项系统服务。代码实现如下:

如果有是在另外一个python原理文件中使用这个cookie的话再打开url之前需偠先载入cookie:

我要回帖

更多关于 HAO 的文章

 

随机推荐