前言

自从上两篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用以及利用遗传算法求解有向图的最短路径之后,我经过不断学习工具箱的官方文档以及对源码的研究,更加掌握如何利用遗传算法求解更多有趣的问题了。

与前面的文章不同,本篇采用差分进化算法来优化SVM中的参数C和Gamma。(用遗传算法也可以,下面会给出效果比较)

首先简单回顾一下Python高性能实用型遗传和进化算法工具箱的用法。对于一个优化问题,需要做两个步骤便可进行求解:Step1:自定义问题类;Step2:编写执行脚本调用Geatpy进化算法模板对问题进行求解。在上一篇博客曾“详细”介绍过具体的用法:https://blog.csdn.net/weixin_37790882/article/details/84034956,但完整的中文教程可以参考官方文档。

下面切入主题:

首先简单描述一下SVM的使用。本文采用Python的sklearn库来跑SVM算法。sklearn中SVM的算法库分为两类,一类是分类的算法库,包括:SVC、NuSVC和LinearSVC 3个类。另一类是回归算法库,包括:SVR、NuSVR和LinearSVR 3个类。相关的类都包裹在sklearn.svm模块之中。

正文

本文重点讲解利用SVC这个类来对iris数据集的数据进行分类。iris数据集的数据格式如下:

前4列是特征数据,第5列是标签数据。整个数据集一共有3种标签:Iris-setosa、Iris-versicolor、Iris-virginica。

采用SVC对数据进行分类的一般步骤为:

Step1:读取训练集的特征数据,并保存在一个Numpy array类型“矩阵”中,使得每一列代表一个特征,每一行代表一组数据,并对数据进行标准化处理。

Step2:读取训练集的标签数据,保存在一个Numpy array类型的行向量中。

Step3:寻找最优参数C和Gamma。

Step4:使用最优参数实例化SVC类的对象(即创建分类器对象),并调用它的成员函数fit()利用训练集的数据来拟合分类器模型。

Step5:用与Step1和Step2同样的方法读取测试集的特征数据和标签数据,并对特征数据进行标准化处理。

Step6:用Step4中训练好的分类器对标准化后的特征数据进行预测,预测出每组特征数据对应的标签。

Step7:把预测出的标签数据和读取到的测试集标签数据进行对比,计算正确率。

在上面的步骤中,寻找最优参数C和Gamma是一个关键步骤,一般采用固定步长的网格搜索策略以及交叉验证来寻找最优参数。而本文采用差分进化算法来寻找该最优参数,差分进化算法基本流程和一般的进化算法相差无几,这里就不赘述了,权威又易懂的参考文献如下:

Price, K.V., Storn, R.N. and Lampinen, J.A.. Differential Evolution: A Practical Approach to Global Optimization. : Springer, 2005.

代码实现(摘自Geatpy网站中的单目标优化案例6)

1)首先把模型写到自定义问题类中,代码如下:

# -*- coding: utf-8 -*-
"""MyProblem.py"""
import numpy as np
import geatpy as ea
from sklearn import svm
from sklearn import preprocessing
from sklearn.model_selection import cross_val_score
from multiprocessing.dummy import Pool as ThreadPool
class MyProblem(ea.Problem): # 继承Problem父类def __init__(self):name = 'MyProblem' # 初始化name(函数名称,可以随意设置)M = 1 # 初始化M(目标维数)maxormins = [-1] # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)Dim = 2 # 初始化Dim(决策变量维数)varTypes = [0, 0] # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)lb = [2**(-8)] * Dim # 决策变量下界ub = [2**8] * Dim # 决策变量上界lbin = [1] * Dim # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)ubin = [1] * Dim # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)# 调用父类构造方法完成实例化ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)# 目标函数计算中用到的一些数据fp = open('iris_train.data')datas = []data_targets = []for line in fp.readlines():line_data = line.strip('n').split(',')data = []for i in line_data[0:4]:data.append(float(i))datas.append(data)data_targets.append(line_data[4])fp.close()self.data = preprocessing.scale(np.array(datas)) # 训练集的特征数据(归一化)self.dataTarget = np.array(data_targets)def aimFunc(self, pop): # 目标函数,采用多线程加速计算Vars = pop.Phen # 得到决策变量矩阵pop.ObjV = np.zeros((pop.sizes, 1)) # 初始化种群个体目标函数值列向量def subAimFunc(i):C = Vars[i, 0]G = Vars[i, 1]svc = svm.SVC(C=C, kernel='rbf', gamma=G).fit(self.data, self.dataTarget) # 创建分类器对象并用训练集的数据拟合分类器模型scores = cross_val_score(svc, self.data, self.dataTarget, cv=10) # 计算交叉验证的得分pop.ObjV[i] = scores.mean() # 把交叉验证的平均得分作为目标函数值pool = ThreadPool(2) # 设置池的大小pool.map(subAimFunc, list(range(pop.sizes)))def test(self, C, G): # 代入优化后的C、Gamma对测试集进行检验# 读取测试集数据fp = open('iris_test.data')datas = []data_targets = []for line in fp.readlines():line_data = line.strip('n').split(',')data = []for i in line_data[0:4]:data.append(float(i))datas.append(data)data_targets.append(line_data[4])fp.close()data_test = preprocessing.scale(np.array(datas)) # 测试集的特征数据(归一化)dataTarget_test = np.array(data_targets) # 测试集的标签数据svc = svm.SVC(C=C, kernel='rbf', gamma=G).fit(self.data, self.dataTarget) # 创建分类器对象并用训练集的数据拟合分类器模型dataTarget_predict = svc.predict(data_test) # 采用训练好的分类器对象对测试集数据进行预测print("测试集数据分类正确率 = %s%%"%(len(np.where(dataTarget_predict == dataTarget_test)[0]) / len(dataTarget_test) * 100))

上面的代码里利用交叉验证得到的平均得分作为待优化的目标函数值,因为分数越高表示参数越好,因此上面的maxormins设置为[-1],表示待优化的目标是个最大化的目标。设置C和Gamma的搜索区间均为2的负8次方到2的8次方。

2)然后创建执行脚本,调用差分进化算法模板soea_DE_rand_1_bin进行利用DE/rand/1/bin差分进化算法优化来优化上面定义好的待优化模型,代码如下:

# -*- coding: utf-8 -*-
"""main.py"""
import geatpy as ea # import geatpy
from MyProblem import MyProblem # 导入自定义问题接口
if __name__ == '__main__':"""===============================实例化问题对象==========================="""problem = MyProblem() # 生成问题对象"""=================================种群设置==============================="""Encoding = 'RI'       # 编码方式NIND = 20             # 种群规模Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders) # 创建区域描述器population = ea.Population(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)"""===============================算法参数设置============================="""myAlgorithm = ea.soea_DE_rand_1_bin_templet(problem, population) # 实例化一个算法模板对象myAlgorithm.MAXGEN = 30 # 最大进化代数myAlgorithm.trappedValue = 1e-6 # “进化停滞”判断阈值myAlgorithm.maxTrappedCount = 10 # 进化停滞计数器最大上限值,如果连续maxTrappedCount代被判定进化陷入停滞,则终止进化myAlgorithm.logTras = 1  # 设置每隔多少代记录日志,若设置成0则表示不记录日志myAlgorithm.verbose = True  # 设置是否打印输出日志信息myAlgorithm.drawing = 1  # 设置绘图方式(0:不绘图;1:绘制结果图;2:绘制目标空间过程动画;3:绘制决策空间过程动画)"""===========================调用算法模板进行种群进化======================="""[BestIndi, population] = myAlgorithm.run()  # 执行算法模板,得到最优个体以及最后一代种群BestIndi.save()  # 把最优个体的信息保存到文件中"""==================================输出结果============================="""print('用时:%f 秒' % myAlgorithm.passTime)print('评价次数:%d 次' % myAlgorithm.evalsNum)if BestIndi.sizes != 0:print('最优的目标函数值为:%s' % BestIndi.ObjV[0][0])print('最优的控制变量值为:')for i in range(BestIndi.Phen.shape[1]):print(BestIndi.Phen[0, i])else:print('没找到可行解。')"""=================================检验结果==============================="""problem.test(C = BestIndi.Phen[0][0], G = BestIndi.Phen[0][1])

运行结果如下:

后记

上面的执行脚本中调用了DE/rand/1/bin的差分进化算法进行进化优化,实际上还可以调用其他的比如遗传算法、遗传策略等的算法模板进行进化优化。例如调用最经典的遗传算法:

# 把这一行替换上面main.py中的soea_DE_rand_1_bin_templet...那一行
myAlgorithm = ea.soea_SGA_templet(problem, population)

按照上面注释中的描述修改main.py代码后运行结果如下:

可见采用SGA进行参数优化的效果稍微比不上采用DE/rand/1/bin差分进化算法,这意味着对于训练集的数据而言,后者分类的准确率比前者低;但对于测试集而言,两者分类的正确率一样。

最后回顾一下上一篇博客提到的”进化算法套路“(上篇写的是“遗传”,这篇拓展为“进化”):

该套路实现了具体问题、使用的算法以及所调用的相关算子之间的脱耦。而Geatpy工具箱已经内置了众多进化算法模板类以及相关的算子,直接调用即可。对于实际问题的求解,只需关心如何把问题写在自定义问题类中就好了。

本文所用到的实验代码很好地体现了这个流程,整个过程里面我没有关心进化算法的具体实现,只管怎么把待优化的模型写在自定义问题类MyProblem中。

更多详细的教程可以详见:http://geatpy.com/index.php/geatpy%E6%95%99%E7%A8%8B/

后续我将继续学习和挖掘该工具箱的更多深入的用法。希望这篇文章在帮助自己记录学习点滴之余,也能帮助大家!

差分进化算法_Python进化算法工具箱的使用(三)用进化算法优化SVM参数相关推荐

  1. svm回归matlab工具箱很慢,PSO优化SVM参数进行回归预测,结果很不理想

    具体程序代码如下,主要问题就是不管我怎么调整参数,最终的预测结果都没有太大的变化,还请了解这两大算法的帮忙看看问题出在哪里了,十分感谢! tic; close all; clear; clc; for ...

  2. python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你

    许多小伙伴后台私信说,python算法让自己很头疼,有没有可以让算法像小说一样有趣的书籍资料呢?看这里吧!小宋为大家找到了这本<算法图解>的PDF电子版!让你在学习python的路上变得轻 ...

  3. 利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma

    该案例展示了如何利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma. 在执行本案例前,需要确保正确安装sklearn,以保证SVM部分的代码能够正常执行. 本函数需要用到一个外部数据 ...

  4. 用进化算法来优化SVM的参数C和Gamma——利用SCOOP库进行分布式加速计算

    该案例展示了如何利用SCOOP库进行分布式加速计算Geatpy进化算法程序, 本案例和soea_demo6类似,同样是用进化算法来优化SVM的参数C和Gamma, 不同的是,本案例选用更庞大的数据集, ...

  5. php实现图片液化,图像变形算法:实现Photoshop液化工具箱中向前变形工具

    很多时候,我们需要对一个图像的局部进行调整,这个调整必须是平滑的和可交互式的.Photoshop液化滤镜中向前变形工具就是这样一个工具,很好用.类似工具有美图秀秀的瘦脸功能.本文描述这类工具背后的原理 ...

  6. Acwing算法基础【1】基础(三)前缀和与差分

    目录 三.前缀和与差分 3.1 前缀和 3.1.1 一维前缀和的算法思想 3.1.2 一维前缀和的代码实现 3.1.3 二维前缀和的基本思想 3.1.4 二维前缀和的代码实现 3.2 差分 3.2.1 ...

  7. 谱估计matlab,利用MATLAB工具箱比较三种谱估计算法

    总第175期2009年第1期 舰船电子工程 Ship Electr onic Engineering V o l.29No.1 96 利用MATLAB工具箱比较三种谱估计算法* 盖明明1)郗海龙2)姜 ...

  8. python实现快排算法_Python实现快速排序算法

    Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide and ...

  9. pythonopencv算法_python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要 ...

  10. python实现关联算法_python使用Apriori算法进行关联性解析

    从大规模数据集中寻找物品间的隐含关系被称作关联分析或关联规则学习.过程分为两步:1.提取频繁项集.2.从频繁项集中抽取出关联规则. 频繁项集是指经常出现在一块的物品的集合. 关联规则是暗示两种物品之间 ...

最新文章

  1. 高考估分查分选志愿一键搞定_支付宝又操办了件人生大事
  2. 无法连接MySQL_MySQL不能从外部 连接的解决方法
  3. mysql自动写入创建时间_mysql 自动记录数据插入及最后修改时间
  4. BLE通信过程中,一次连接间隔最多可以发多少包,BLE的最大通信速度为多少
  5. Java EE 6示例– Galleria
  6. Joomla2.5模板简明教程
  7. python--集合概念和实战(一)
  8. era5数据内容说明_接口测试:A04_HttpRunner通用_02_提取数据_01_extract关键字
  9. 编译Windows版本ffmpeg:cygwin方式通过
  10. 彩灯控制器课程设计vhdl_EDA课程设计:彩灯控制器
  11. iOS开发面试只需知道这些,技术基本通关!(网络篇)
  12. 绿色IT实现的阻碍 IT企业污染严重
  13. 2021年全球及中国旅游产业发展现状及趋势分析[图]
  14. MongoDB的基础指令和练习笔记
  15. c语言tab什么意思_收藏 | C语言最全入门笔记
  16. 静态路由出接口和下一跳
  17. 风华秋实再度递表港交所:非控股权益亏损扩大,涉三七互娱等
  18. 丰田汽车音频总线AVC-LAN
  19. c语言--候选人计票程序
  20. 战争与征服服务器维护,《战争与征服》12月5日停机维护公告

热门文章

  1. GhostXP SP3 中关村系统装机版 2013
  2. VIJOS 1547 逆转,然后再见
  3. 时速云CEO:相对于IaaS和PaaS,未来CaaS将如何定位?
  4. attachEvent方法绑定事件
  5. Hybrid App的架构
  6. 用Python搭建股票舆情分析系统
  7. 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
  8. 软件设计师-计算机系统知识
  9. python 微博自动点赞软件_python3 爬虫学习: 自动给你心上人的微博点赞
  10. Servlet实现上传下载