deap遗传算法 tirads代码解读

  • 写在最前面
    • Overview 程序概览
    • 参考
  • deap框架介绍
  • creator模块
    • 创建适应度类Types
      • 定义适应度策略
    • 创建个体类
  • Toolbox类
    • 创建种群(个体、策略以及粒子)Initialization
      • 1. 创建 attr_int 运算符
      • 2. 创建 individual_guess() 运算
      • 3.创建新运算 individual()(注:本文为Seedling a Population初始化方法与常规初始化方法的结合,因而官方文档中没有该部分)
      • 4.创建新运算 population_guess()
      • 该论文的种群创建与官方文档的对比
    • 创建遗传算子 Operators
      • mutate方法
      • 常用实现函数 tools 模块
    • 计算适应度
  • 计算程序 Algorithms

写在最前面

以代码解读为主,方便后续换数据后改代码

一开始直接看的代码,但感觉和之前的不一样,一步理解错了,后面全理解不了(果然和wl老师说的一样,得一步步查,理解里面的参数)
然后根据代码查到了deap的简介和使用,结果发现这篇论文的代码不是基础的个体初始化
后面又查到了Seedling a Population初始化种群,发现大体一样,但还是有区别
最后从官方文档的注释,猜测是Seedling a Population初始化方法与常规初始化方法的结合,这才把创建种群这部分的代码理解的七七八八

Overview 程序概览

1.Types : 选择你要解决的问题类型,确定要求解的问题个数,最大值还是最小值
2. Initialization : 初始化基因编码位数,初始值,等基本信息
3. Operators : 操作,设计evaluate函数,在工具箱中注册参数信息:交叉,变异,保留个体,评价函数
4. Algorithm : 设计main函数,确定参数并运行得到结果

参考

官方文档:http://deap.readthedocs.io/en/master/index.html
deap框架中文翻译,主要参考:
https://developer.aliyun.com/article/833958
创建种群类部分,参考:
https://www.jianshu.com/p/ee8ee76225c1
通过猜测的值来初始化进化函数,参考:
https://zhuanlan.zhihu.com/p/69071128
补充,参考:
https://blog.csdn.net/FontThrone/article/details/78253230

deap框架介绍

目前,有许多可用于遗传算法的 Python 框架 —— GAFT,DEAP,Pyevolve 和 PyGMO 等。

其中,deap (Distributed Evolutionary Algorithms in Python) 框架支持使用遗传算法以及其他进化计算技术快速开发解决方案,得到了广泛的应用。deap 提供了各种数据结构和工具,这些数据和工具在实现各种基于遗传算法的解决方案时必不可少。

creator模块

creator 模块可以作为元工厂,能够通过添加新属性来扩展现有类。
例如,传递给 create() 函数的 第一个参数 是新类的名称。第二个参数 是要扩展的现有类,接下来是使用其他参数定义新类的属性。
如果为参数分配了一个类(例如 dict 或 set ),它将作为构造函数中初始化的实例属性添加到新类中。如果参数不是类(例如字符串),则将其添加为静态 (static) 属性。

这个新类存在于 creator 模块中,因此需要引用时使用 creator.Developer。
使用 deap 时,creator 模块通常用于创建 Fitness 类以及 Individual 类。

创建适应度类Types

使用 deap 时,适应度封装在 Fitness 类中。在 deap 框架中适应度可以有多个组成部分,每个组成部分都有自己的权重(weights)。
这些权重的组合定义了适合给定问题的行为或策略。

定义适应度策略

产生一个 creator.FitnessMax 类,该类扩展了 base.Fitness 类,并将 weights 类属性初始化为 (1.0,)值。
需要注意的是:weights 参数是一个元组。

FitnessMax 类的策略是在遗传算法过程中 最大化单目标解的适应度值

from deap import base, creatorcreator.create("FitnessMax", base.Fitness, weights=(1.0,))

(备注)相反,如果有一个单目标问题,需要使适应度值最小的解,则可以使用以下定义来 创建最小化策略

creator.create("FitnessMin",base.Fitness,weights=(-1.0,))

还可以定义具有优化多个目标且重要性不同的策略

creator.create("FitnessCompound",base.Fitness,weights=(1.0,0.2,-0.5))

它拥有三个不同的适应度组成部分。第一部分权重为 1.0,第二部分权重为 0.2,第三部分权重为 -0.5。这将倾向于使第一和第二部分(或目标)最大化,而使第三部分(或目标)最小化。

创建个体类

在 deap 中,creator 工具的第二个常见用途是定义构成遗传算法种群的个体。
遗传算法中的个体使用可以由遗传算子操纵的染色体来表示,通过扩展表示染色体的基类来创建 Individual 类。
另外,deap 中的每个个体实例都需要包含其适应度函数作为属性。

creator.create("Individual", list, fitness=creator.FitnessMax)

该代码片段具有以下两个效果:
• 创建的 Individual 类扩展了 Python 的 list 类,这意味着使用的染色体是列表类型
• 创建的 Individual 类的每个实例将具有之前创建的 FitnessMax 属性:最大化单目标解的适应度值

Toolbox类

deap 框架提供的第二种高效创建遗传算法的机制是 base.Toolbox 类。
Toolbox 用作函数(或操作)的容器,能够通过别名机制和自定义现有函数来创建新的运算符。

在使用时首先要调用base.Toolbox()。

import base
toolbox = base.Toolbox()

然后再对register进行调用。

传递给 register() 函数的参数
第一个参数 是新运算符所需的名称(或别名),第二个参数 是被定制的现有函数。
创建完成后,每当调用新运算符时,其他参数都会自动传递给创建的函数。

创建种群(个体、策略以及粒子)Initialization

种群 与个体非常类似,它们不是用属性初始化,而是充满了个体、策略以及粒子(针对不同方法采取不同的种群)。
需要将deap包中所带方法与要编写的演化算法进行 固定:包括初始化、操作方法以及适应度函数的计算

该论文代码中,使用的是Seedling a Population初始化方法与常规初始化方法的结合,这样就可以拥有部分随机个体和部分非随机个体
优点:一定程度上可以加快收敛,并且也提供了不完全随机的生成方法。

Seedling a Population,通过猜想来对数据进行手动初始化。

DEAP1.2.2文档(二)中关于该方案的解读:
有时候,需要一个 猜测种群来初始化进化算法。使用猜测值进行初始化,而非使用随机个体的群体。
关键思想是,需要建立一个将内容作为参数的个体初始化函数。

原代码对该段函数的注释

Individual is a list of 19 integers corresponding to ACR TI-RADS features excluding cyctic and spongiform (which are not optimized) and anechoich and extra-thyroidal extension (which are not available)

Individual是一个19个整数的列表,对应于ACR TI-RADS特征不包括环状和海绵状(未优化)和无回声和甲状腺外延伸(这是不可用的)

利用 Toolbox,用于创建和初始化遗传算法的函数

1. 创建 attr_int 运算符

重定向 到random.radint()函数,返回[0,3]范围内的整数值

import random
from deap import tools# Attribute generator
# 属性生成器
toolbox.register("attr_int", random.randint, 0, 3)

random randint() 方法 返回指定范围内的整数。

random.randint(start, stop)
参数说明:
start – 必需, 一个整数,指定开始值。
stop – 必需,一个整数,指定结束值。

2. 创建 individual_guess() 运算

使用 toolbox,创建一个新的运算 individual_guess()
该运算符利用 initIndividual() 函数创建,传递通过猜测值来初始化创建个体的参数

def initIndividual(icls, content):return icls(content)# Structure initializers
# 结构初始化器
toolbox.register("individual_guess", initIndividual, creator.Individual)

其中,initIndividual为前面定义的函数,creator.Individual为前面创建的个体类

3.创建新运算 individual()(注:本文为Seedling a Population初始化方法与常规初始化方法的结合,因而官方文档中没有该部分)

需要导入模块:

# from deap import tools [as 别名]
# 或: from deap.tools import initRepeat [as 别名]

该运算符利用 initIndividual() 函数创建,传递创建个体们的参数:由19个随机的整数构成,并且它们的适应值是一个最大适应值

IND_SIZE = 19
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_int, n = IND_SIZE)

initRepeat()函数,将它容器中的元素填充到creator.Individual class中,它对toolbox.attr_int()函数的func参数根据IND_SIZE(这里的n,即19)进行重复。
注:(原注释)Individual是一个19个整数的列表

toolbox.individual()将会使用设置好的参数调用initRepeat(),并且会返回到一个完成的creator.Individual中
这个creator.Individual是由IND_SIZE的整数和最大化单目标优化适应度信息fitness组成。
即在本例中,individual是由19个随机的整数构成,并且它们的适应值是一个最大适应值。

4.创建新运算 population_guess()

返回:100个种群list(其中,初始化种群为[2, 2, 1, 1, 1, 1, 2, 3, 0, 3, 0, 0, 2, 0, 0, 2, 0, 1, 3])

# Number of indiviguals in population
# 种群中的个体数量
population_count = 100# All individuals in initial population are ACR TI-RADS
# 初始种群中的所有个体都是ACR TI-RADS
def initPopulation(pcls, ind_init, initial_state):return [pcls(ind_init(eval(initial_state)))] * population_countinitial_state = '[2, 2, 1, 1, 1, 1, 2, 3, 0, 3, 0, 0, 2, 0, 0, 2, 0, 1, 3]'
toolbox.register("population_guess", initPopulation, list, toolbox.individual_guess, initial_state)

等效于:

initPopulation(list, toolbox.individual_guess, initial_state)

其中,toolbox.individual_guess等效于:种群(初始化种群为[2, 2, 1, 1, 1, 1, 2, 3, 0, 3, 0, 0, 2, 0, 0, 2, 0, 1, 3])

即返回:

100个种群list(初始化种群为[2, 2, 1, 1, 1, 1, 2, 3, 0, 3, 0, 0, 2, 0, 0, 2, 0, 1, 3])

该论文的种群创建与官方文档的对比

该论文为Seedling a Population初始化方法与常规初始化方法的结合,这样就可以拥有部分随机个体和部分非随机个体。

因此官方文档中Seedling a Population没有创建 individual()的部分,但初始化种群为json文件,而该论文代码中为1个list,因此需要这部分

种群将会从文件my_guess.json初始化,将会包含一个拥有第一猜想的列表。

其中,initIndividual()和individual_guess()是可以选择的,这是因为它们的默认结构是相似的。
可以移除212行使用217行的代码代替。

创建遗传算子 Operators

为了快速构建遗传流程,可以使用 Toolbox 类定制 tools 模块的现有函数。tools 模块包含许多便捷的函数,这些函数包括选择、交叉和变异的遗传算子以及程序的初始化等。

下面定义了四个别名函数,用作遗传算子:

# Hyperparameters of genetic algorithm and optimization constraints
# 遗传算法超参数及优化约束
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutUniformInt, low=0, up=3, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=4)

这四个别名函数的详细说明:

  1. mate (交叉) 注册为 tools 函数 cxTwoPoint() 的别名,这将创建执行两点交叉的toolbox.mate算子
  2. mutate (变异) 注册为 tools 函数 mutUniformInt() 的别名,并将 indpb 参数设置为 0.05,这将创建一个翻转每个特征的概率为 0.05 的位翻转突变算子。且特征被赋0、1、2或3分的可能值
  3. select (选择保留最佳个体)注册为 tools 函数 selTournament() 的别名,且 tournsize 参数设置为 4。这将创建 toolbox.select 运算符,其为锦标赛规模为 4 的锦标赛选择算子(即,对后代个体的选择是基于4个随机抽取的父母个体,然后选择最好的一个)

mutate方法

这个函数适用于输入个体的平均值和标准差的高斯突变

mu:python中基于平均值的高斯变异

sigma:python中基于标准差的高斯变异

indpb:每个属性的独立变异概率

常用实现函数 tools 模块

提供了各种遗传算子的实现,以下列示常用遗传算子的实现函数。

选择算子 主要包括:
selRoulette() #轮盘选择
selStochasticUniversalSampling() #随机遍历采样(SUS)
selTournament() #锦标赛选择
交叉算子 主要包括:
cxOnePoint() #单点交叉
cxUniform() #均匀交叉
cxOrdered() #有序交叉
cxPartialyMatched() #实现部分匹配交叉
突变算子 主要包括:
mutFlipBit() #位翻转突变
mutGaussian() #正态分布突变

计算适应度

evaluate : 选择评价函数,要注意返回值的地方最后面要多加一个逗号

def tirads_auc_loss(w):# Add 0 points for cystic and spongiform features which are not optimized# 未优化的囊状和海绵状特征添加0个点w = np.array([w[:1] + [0] + w[1:3] + [0] + w[3:]])X = df_features.as_matrix()# Give 0 total points for all cystic and spongiform nodules# 所有囊性及海绵状结节加0分x_cyst = X[:, 1]x_cyst = np.abs(x_cyst - 1)x_spon = X[:, 4]x_spon = np.abs(x_spon - 1)X = X * np.expand_dims(x_cyst, axis=-1)X = X * np.expand_dims(x_spon, axis=-1)# Compute AI TI-RADS points# 计算AI TI-RADS点ai_tirads_points = np.dot(X, w.T).flatten()return roc_auc_score(y_true_train, ai_tirads_points),toolbox.register("evaluate", tirads_auc_loss)

计算程序 Algorithms

epochs = 50# Random seed for reproducibility
# 随机种子的可重复性,确保可以复现结果
random.seed(0)

deap遗传算法 tirads代码解读相关推荐

  1. 200行代码解读TDEngine背后的定时器

    作者 | beyondma来源 | CSDN博客 导读:最近几周,本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响,原以为C语言已经是昨日黄花,不过从读 ...

  2. 装逼一步到位!GauGAN代码解读来了

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:游璐颖,福州大学,Datawhale成员 AI神笔马良 如何装逼一 ...

  3. Unet论文解读代码解读

    论文地址:http://www.arxiv.org/pdf/1505.04597.pdf 论文解读 网络 架构: a.U-net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少 ...

  4. Lossless Codec---APE代码解读系列(二)

    APE file 一些概念 APE代码解读系列(一) APE代码解读系列(三) 1. 先要了解APE compression level APE主要有5level, 分别是: CompressionL ...

  5. RT-Thread 学习笔记(五)—— RTGUI代码解读

    ---恢复内容开始--- RT-Thread 版本:2.1.0 RTGUI相关代码解读,仅为自己学习记录,若有错误之处,请告知maoxudong0813@163.com,不胜感激! GUI流程: ma ...

  6. vins 解读_代码解读 | VINS 视觉前端

    AI 人工智能 代码解读 | VINS 视觉前端 本文作者是计算机视觉life公众号成员蔡量力,由于格式问题部分内容显示可能有问题,更好的阅读体验,请查看原文链接:代码解读 | VINS 视觉前端 v ...

  7. BERT:代码解读、实体关系抽取实战

    目录 前言 一.BERT的主要亮点 1. 双向Transformers 2.句子级别的应用 3.能够解决的任务 二.BERT代码解读 1. 数据预处理 1.1 InputExample类 1.2 In ...

  8. shfflenetv2代码解读

    shufflenetv2代码解读 目录 shufflenetv2代码解读 概述 shufflenetv2网络结构图 shufflenetv2架构参数 shufflenetv2代码细节分析 概述 shu ...

  9. GoogLeNet代码解读

    GoogLeNet代码解读 目录 GoogLeNet代码解读 概述 GooLeNet网络结构图 1)从输入到第一层inception 2)从第2层inception到第4层inception 3)从第 ...

最新文章

  1. 为了杀蚊子,这位博士用树莓派DIY了一把激光枪!网友:伤到人怎么办?
  2. git 添加外部项目地址
  3. 利用js实现table增加一行
  4. PMcaff-活动| 产品经理免费培训最后一批通过名单公布啦!
  5. flutter 实现不可滚动的ListView构建器
  6. [react] react中调用setState会更新的生命周期有哪几个?
  7. c++基础语句代码(循环语句)
  8. Power Designer逆向工程连接数据库创建pdm-oracle
  9. 将MfgTool工具改造为自己的烧写工具
  10. repo + gerrit
  11. dz安装教程php,discuz论坛安装教程 2017最新discuz论坛安装教程
  12. 【电源专题】BUCK电源效率和输出电压的关系
  13. 懒人版黑苹果mbr安装_BIOS+MBR硬盘,一步一步教你怎么用clover装黑苹果
  14. 女生叫你哥和大哥区别_大哥正望着你
  15. 短视频“音频化”,音乐“视频化”
  16. Mixpanel 可视化ABTest分析 —— iOS篇
  17. 2018云原生技术实践峰会CNBPS 重新定义云原生
  18. 计算机网络的全局模式是,全局配置模式-计算机网络精品课程网.PPT
  19. 颤抖吧(C++) kkmd66
  20. polystyrene beads Profiling的一些设置

热门文章

  1. android获取网址xml,从网址解析的Android ListFragment(sherlock)xml
  2. 渗透测试--越权测试BroupSuite安装教程
  3. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 BertViz
  4. Linux(12)Debain系统安装远程控制软件
  5. InVEST模型 | 02 InVEST模型Python安装
  6. PolarDB-X 开源分布式数据库在韵达科技的应用实践
  7. 什么是NLP与NLU的主要区别,为什么很重要?
  8. 电脑PC软件 EXE软件文件加密工具
  9. PHP天天竞拍手机网站源码,天天试用源码竞拍源码
  10. 无线仪表变送器设备联网服务器,基于无线HART通信技术的仪表管理与诊断系统的设计.pdf...