大家好,关于遗传算法原理很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于遗传算法的原理详解的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
geatpy提供了许多已实现的遗传和进化算法相关算子的库函数,如初始化种群、选择、交叉、变异、重插入、多目标优化非支配排序等,并且提供诸多已实现的进化算法模板来实现多样化的进化算法。
其执行效率高于Matlab、Java和Python编写的一些知名工具箱、平台或框架等,学。。。成本低、模块高度脱耦、扩展性高。
几天前,我着手解决一个实际问题——大型超市销售问题。在使用了几个简单模型做了一些特征工程之后,我在排行榜上名列第219名。
虽然结果不错,但是我还是想做得更好。
于是,我开始研究可以提高分数的优化方法。结果我果然找到了一个,它叫遗传算法。在把它应用到超市销售问题之后,最终我的分数在排行榜上一下跃居前列。
没错,仅靠遗传算法我就从219名直接跳到15名,厉害吧!相信阅读完本篇文章后,你也可以很自如地应用遗传算法,而且会发现,当把它用到你自己正在处理的问题时,效果也会有很大提升。
目录
1、遗传算法理论的由来
2、生物学的启发
3、遗传算法定义
4、遗传算法具体步骤
初始化
适应度函数
选择
交叉
变异
5、遗传算法的应用
特征选取
使用TPOT库实现
6、实际应用
7、结语
1、遗传算法理论的由来
我们先从查尔斯·达尔文的一句名言开始:
不是最强大、也不是最聪明的物种才能生存,而是最能对变化作出回应的那一个。
你也许在想:这句话和遗传算法有什么关系?其实遗传算法的整个概念就基于这句话。让我们用一个基本例子来解释:
我们先假设一个情景,现在你是一国之王,为了让你的国家免于灾祸,你实施了一套法案:
你选出所有的好人,要求其通过生育来扩大国民数量。
这个过程持续进行了几代。
你将发现,你已经有了一整群的好人。
这个例子虽然不太可能,但是我用它是想帮助你理解概念。也就是说,我们改变了输入值(比如:人口),就可以获得更好的输出值(比如:更好的国家)。
现在,我假定你已经对这个概念有了大致理解,认为遗传算法的含义应该和生物学有关系。那么我们就快速地看一些小概念,这样便可以将其联系起来理解。
2、生物学的启发
相信你还记得这句话:
“细胞是所有生物的基石。”
由此可知,在一个生物的任何一个细胞中,都有着相同的一套染色体。所谓染色体,就是指由DNA组成的聚合体。
传统上看,这些染色体可以被由数字0和1组成的字符串表达出来。
一条染色体由基因组成,这些基因其实就是组成DNA的基本结构,DNA上的每个基因都编码了一个独特的性状,比如,头发或者眼睛的颜色。
希望你在继续阅读之前先回忆一下这里提到的生物学概念。结束了这部分,现在我们来看看所谓遗传算法实际上指的是什么?
3、遗传算法定义
首先我们回到前面讨论的那个例子,并总结一下我们做过的事情。
1. 首先,我们设定好了国民的初始人群大小。
2. 然后,我们定义了一个函数,用它来区分好人和坏人。
3. 再次,我们选择出好人,并让他们繁殖自己的后代。
4. 最后,这些后代们从原来的国民中替代了部分坏人,并不断重复这一过程。
遗传算法实际上就是这样工作的,也就是说,它基本上尽力地在某种程度上模拟进化的过程。因此,为了形式化定义一个遗传算法,我们可以将它看作一个优化方法,它可以尝试找出某些输入,凭借这些输入我们便可以得到最佳的输出值或者是结果。遗传算法的工作方式也源自于生物学,具体流程见下图:
那么现在我们来逐步理解一下整个流程。
4、遗传算法具体步骤
为了让讲解更为简便,我们先来理解一下著名的组合优化问题“背包问题”。如果你还不太懂,这里有一个我的解释版本。
比如,你准备要去野游1个月,但是你只能背一个限重30公斤的背包。现在你有不同的必需物品,它们每一个都有自己的“生存点数”(具体在下表中已给出)。因此,你的目标是在有限的背包重量下,最大化你的“生存点数”。
4.1初始化
这里我们用遗传算法来解决这个背包问题。第一步是定义我们的总体。总体中包含了个体,每个个体都有一套自己的染色体。
我们知道,染色体可表达为2进制数串,在这个问题中,1代表接下来位置的基因存在,0意味着丢失。(译者注:作者这里借用染色体、基因来解决前面的背包问题,所以特定位置上的基因代表了上方背包问题表格中的物品,比如第一个位置上是SleepingBag,那么此时反映在染色体的‘基因’位置就是该染色体的第一个‘基因’。)
现在,我们将图中的4条染色体看作我们的总体初始值。
4.2适应度函数
接下来,让我们来计算一下前两条染色体的适应度分数。
对于A1染色体[100110]而言,有:
类似地,对于A2染色体[001110]来说,有:
对于这个问题,我们认为,当染色体包含更多生存分数时,也就意味着它的适应性更强。因此,由图可知,染色体1适应性强于染色体2。
4.3选择
现在,我们可以开始从总体中选择适合的染色体,来让它们互相‘交配’,产生自己的下一代了。
这个是进行选择操作的大致想法,但是这样将会导致染色体在几代之后相互差异减小,失去了多样性。
因此,我们一般会进行“轮盘赌选择法”(RouletteWheelSelectionmethod)。
想象有一个轮盘,现在我们将它分割成m个部分,这里的m代表我们总体中染色体的个数。每条染色体在轮盘上占有的区域面积将根据适应度分数成比例表达出来。
基于上图中的值,我们建立如下“轮盘”。
现在,这个轮盘开始旋转,我们将被图中固定的指针(fixedpoint)指到的那片区域选为第一个亲本。然后,对于第二个亲本,我们进行同样的操作。
有时候我们也会在途中标注两个固定指针,如下图:
通过这种方法,我们可以在一轮中就获得两个亲本。我们将这种方法成为“随机普遍选择法”(StochasticUniversalSelectionmethod)。
4.4交叉
在上一个步骤中,我们已经选择出了可以产生后代的亲本染色体。那么用生物学的话说,所谓“交叉”,其实就是指的繁殖。
现在我们来对染色体1和4(在上一个步骤中选出来的)进行“交叉”,见下图:
这是交叉最基本的形式,我们称其为“单点交叉”。这里我们随机选择一个交叉点,然后,将交叉点前后的染色体部分进行染色体间的交叉对调,于是就产生了新的后代。
如果你设置两个交叉点,那么这种方法被成为“多点交叉”,见下图:
4.5变异
如果现在我们从生物学的角度来看这个问题,那么请问:由上述过程产生的后代是否有和其父母一样的性状呢?答案是否。在后代的生长过程中,它们体内的基因会发生一些变化,使得它们与父母不同。
这个过程我们称为“变异”,它可以被定义为染色体上发生的随机变化,正是因为变异,种群中才会存在多样性。
下图为变异的一个简单示例:
变异完成之后,我们就得到了新为个体,进化也就完成了,整个过程如下图:
在进行完一轮“遗传变异”之后,我们用适应度函数对这些新的后代进行验证,如果函数判定它们适应度足够,那么就会用它们从总体中替代掉那些适应度不够的染色体。
这里有个问题,我们最终应该以什么标准来判断后代达到了最佳适应度水平呢?
一般来说,有如下几个终止条件:
在进行X次迭代之后,总体没有什么太大改变。
我们事先为算法定义好了进化的次数。
当我们的适应度函数已经达到了预先定义的值。
好了,现在我假设你已基本理解了遗传算法的要领,那么现在让我们用它在数据科学的场景中应用一番。
5、遗传算法的应用
5.1特征选取
试想一下每当你参加一个数据科学比赛,你会用什么方法来挑选那些对你目标变量的预测来说很重要的特征呢?你经常会对模型中特征的重要性进行一番判断,然后手动设定一个阈值,选择出其重要性高于这个阈值的特征。
那么,有没有什么方法可以更好地处理这个问题呢?其实处理特征选取任务最先进的算法之一就是遗传算法。
我们前面处理背包问题的方法可以完全应用到这里。现在,我们还是先从建立“染色体”总体开始,这里的染色体依旧是二进制数串,“1”表示模型包含了该特征,“0表示模型排除了该特征”。
不过,有一个不同之处,即我们的适应度函数需要改变一下。这里的适应度函数应该是这次比赛的的精度的标准。也就是说,如果染色体的预测值越精准,那么就可以说它的适应度更高。
现在我假设你已经对这个方法有点一概念了。下面我不会马上讲解这个问题的解决过程,而是让我们先来用TPOT库去实现它。
5.2用TPOT库来实现
这个部分相信是你在一开始读本文时心里最终想实现的那个目标。即:实现。
那么首先我们来快速浏览一下TPOT库(Tree-basedPipelineOptimisationTechnique,树形传递优化技术),该库基于scikit-learn库建立。
下图为一个基本的传递结构。
图中的灰色区域用TPOT库实现了自动处理。实现该部分的自动处理需要用到遗传算法。
我们这里不深入讲解,而是直接应用它。
为了能够使用TPOT库,你需要先安装一些TPOT建立于其上的python库。下面我们快速安装它们:
#installingDEAP,update_checkerandtqdmpipinstalldeapupdate_checkertqdm#installlingTPOTpipinstalltpot
这里,我用了Bigmartsales(数据集地址:https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/)数据集,为实现做准备,我们先快速下载训练和测试文件,以下是python代码:
#importbasiclibraries
importnumpyasnp
importpandasaspd
importmatplotlib.pyplotasplt
%matplotlibinline
fromsklearnimportpreprocessing
fromsklearn.metricsimportmean_squared_error
##preprocessing
###meanimputations
train['Item_Weight'].fillna((train['Item_Weight'].mean()),inplace=True)
test['Item_Weight'].fillna((test['Item_Weight'].mean()),inplace=True)
###reducingfatcontenttoonlytwocategories
train['Item_Fat_Content']=train['Item_Fat_Content'].replace(['lowfat','LF'],['LowFat','LowFat'])
train['Item_Fat_Content']=train['Item_Fat_Content'].replace(['reg'],['Regular'])
test['Item_Fat_Content']=test['Item_Fat_Content'].replace(['lowfat','LF'],['LowFat','LowFat'])
test['Item_Fat_Content']=test['Item_Fat_Content'].replace(['reg'],['Regular'])
train['Outlet_Establishment_Year']=2013-train['Outlet_Establishment_Year']
test['Outlet_Establishment_Year']=2013-test['Outlet_Establishment_Year']
train['Outlet_Size'].fillna('Small',inplace=True)
test['Outlet_Size'].fillna('Small',inplace=True)
train['Item_Visibility']=np.sqrt(train['Item_Visibility'])
test['Item_Visibility']=np.sqrt(test['Item_Visibility'])
col=['Outlet_Size','Outlet_Location_Type','Outlet_Type','Item_Fat_Content']
test['Item_Outlet_Sales']=0
foriincol:
combi[i]=number.fit_transform(combi[i].astype('str'))
combi[i]=combi[i].astype('object')
train=combi[:train.shape[0]]
test=combi[train.shape[0]:]
test.drop('Item_Outlet_Sales',axis=1,inplace=True)
##removingidvariables
tpot_train=train.drop(['Outlet_Identifier','Item_Type','Item_Identifier'],axis=1)
tpot_test=test.drop(['Outlet_Identifier','Item_Type','Item_Identifier'],axis=1)
target=tpot_train['Item_Outlet_Sales']
tpot_train.drop('Item_Outlet_Sales',axis=1,inplace=True)
#finallybuildingmodelusingtpotlibrary
fromtpotimportTPOTRegressor
X_train,X_test,y_train,y_test=train_test_split(tpot_train,target,
train_size=0.75,test_size=0.25)
tpot=TPOTRegressor(generations=5,population_size=50,verbosity=2)
tpot.fit(X_train,y_train)
print(tpot.score(X_test,y_test))
tpot.export('tpot_boston_pipeline.py')
一旦这些代码运行完成,tpot_exported_pipeline.py里就将会放入用于路径优化的python代码。我们可以发现,ExtraTreeRegressor可以最好地解决这个问题。
##predictingusingtpotoptimisedpipeline
tpot_pred=tpot.predict(tpot_test)
sub1=pd.DataFrame(data=tpot_pred)
#sub1.index=np.arange(0,len(test)+1)
sub1=sub1.rename(columns={'0':'Item_Outlet_Sales'})
sub1['Item_Identifier']=test['Item_Identifier']
sub1['Outlet_Identifier']=test['Outlet_Identifier']
sub1.columns=['Item_Outlet_Sales','Item_Identifier','Outlet_Identifier']
sub1=sub1[['Item_Identifier','Outlet_Identifier','Item_Outlet_Sales']]
sub1.to_csv('tpot.csv',index=False)
如果你提交了这个csv,那么你会发现我一开始保证的那些还没有完全实现。那是不是我在骗你们呢?
当然不是。实际上,TPOT库有一个简单的规则。如果你不运行TPOT太久,那么它就不会为你的问题找出最可能传递方式。
所以,你得增加进化的代数,拿杯咖啡出去走一遭,其它的交给TPOT就行。
此外,你也可以用这个库来处理分类问题。进一步内容可以参考这个文档:http://rhiever.github.io/tpot/
除了比赛,在生活中我们也有很多应用场景可以用到遗传算法。
6、实际应用
遗传算法在真实世界中有很多应用。这里我列了部分有趣的场景,但是由于篇幅限制,我不会逐一详细介绍。
6.1工程设计
工程设计非常依赖计算机建模以及模拟,这样才能让设计周期过程即快又经济。遗传算法在这里可以进行优化并给出一个很好的结果。
相关资源:
论文:Engineeringdesignusinggeneticalgorithms
地址:http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=16942&context=rtd
6.2交通与船运路线(TravellingSalesmanProblem,巡回售货员问题)
这是一个非常著名的问题,它已被很多贸易公司用来让运输更省时、经济。解决这个问题也要用到遗传算法。
6.3机器人
遗传算法在机器人领域中的应用非常广泛。实际上,目前人们正在用遗传算法来创造可以像人类一样行动的自主学。。。机器人,其执行的任务可以是做饭、洗衣服等等。
相关资源:
论文GeneticAlgorithmsforAuto-tuningMobileRobotMotionControl
地址:https://pdfs.semanticscholar.org/7c8c/faa78795bcba8e72cd56f8b8e3b95c0df20c.pdf
7.结语
希望通过本文介绍,你现在已经对遗传算法有了足够的理解,而且也会用TPOT库来实现它了。但是如果你不亲身实践,本文的知识也是非常有限的。
所以,请各位读者朋友一定要在无论是数据科学比赛或是生活中尝试自己去实现它。
遗传算法将“优胜劣汰,适者生存”的生物进化原理引入优化参数形成的编码串联群体中,按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使适应度高的个体被保留下来,组成新的群体
新的群体既继承了上一代的信息,又优于上一代这样周而复始,群体中个体适应度不断提高,直到满足一定的条件遗传算法的算法简单,可并行处理,并能得到全局最优解。
遗传算法的基本操作有三种:
1复制(ReproductionOperator)
从一个旧种群中选择生命力强的个体产生新种群的过程
具有高适应度的个体更有可能在下一代中产生一个或多个子孙
模拟无性繁殖
2交叉(CrossoverOperator)
复制操作能从旧种群中选择出优秀者,但不能创造新的染色体
交叉模拟了生物进化过程中的有性繁殖现象,通过染色体的交换组合,产生新的优良品种
交叉的过程:在匹配池中任选两个染色体,随机选择一点或多点交换点位置;交换双亲染色体交换点右边的部分,即可得到两个新的染色体数字串
3变异(MutationOperator)
模拟生物在自然的遗传环境中由于各种偶然因素引起的基因突变
以很小的概率随机地改变遗传基因(表示染色体的符号串的某一位)的值
在染色体以二进制编码的系统中,它随机地将染色体的某一个基因由1变为0,或由0变为1
遗传算法迭代的原理是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。
在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学。。。、信号处理、自适应控制和人工生命等领域。
文章分享结束,遗传算法原理和遗传算法的原理详解的答案你都知道了吗?欢迎再次光临本站哦!
ios10短信全屏特效怎么发送 ios10信息iMessage玩法大解析
ios10正式版升级后变砖怎么办 iOS10正式版变砖修复办法
2023-07-09 / 19mb
2023-07-09 / 25mb
2023-07-09 / 25mb
2023-07-09 / 10MB
2023-07-09 / 10MB
2023-07-09 / 15mb