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

2023-12-20 06:18

本文主要是介绍利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该案例展示了如何利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma。
在执行本案例前,需要确保正确安装sklearn,以保证SVM部分的代码能够正常执行。
本函数需要用到一个外部数据集,存放在同目录下的iris.data中,
并且把iris.data按3:2划分为训练集数据iris_train.data和测试集数据iris_test.data。
有关该数据集的详细描述详见http://archive.ics.uci.edu/ml/datasets/Iris
在执行脚本main.py中设置PoolType字符串来控制采用的是多进程还是多线程。
注意:使用多进程时,程序必须以“if __name__ == '__main__':”作为入口,这个是multiprocessing的多进程模块的硬性要求。
# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea
from sklearn import svm
from sklearn import preprocessing
from sklearn.model_selection import cross_val_score
import multiprocessing as mp
from multiprocessing import Pool as ProcessPool
from multiprocessing.dummy import Pool as ThreadPool"""
该案例展示了如何利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma。
在执行本案例前,需要确保正确安装sklearn,以保证SVM部分的代码能够正常执行。
本函数需要用到一个外部数据集,存放在同目录下的iris.data中,
并且把iris.data按3:2划分为训练集数据iris_train.data和测试集数据iris_test.data。
有关该数据集的详细描述详见http://archive.ics.uci.edu/ml/datasets/Iris
在执行脚本main.py中设置PoolType字符串来控制采用的是多进程还是多线程。
注意:使用多进程时,程序必须以“if __name__ == '__main__':”作为入口,这个是multiprocessing的多进程模块的硬性要求。
"""class MyProblem(ea.Problem): # 继承Problem父类def __init__(self, PoolType): # PoolType是取值为'Process'或'Thread'的字符串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)# 设置用多线程还是多进程self.PoolType = PoolTypeif self.PoolType == 'Thread':self.pool = ThreadPool(2) # 设置池的大小elif self.PoolType == 'Process':num_cores = int(mp.cpu_count()) # 获得计算机的核心数self.pool = ProcessPool(num_cores) # 设置池的大小def aimFunc(self, pop): # 目标函数,采用多线程加速计算Vars = pop.Phen # 得到决策变量矩阵args = list(zip(list(range(pop.sizes)), [Vars] * pop.sizes, [self.data] * pop.sizes, [self.dataTarget] * pop.sizes))if self.PoolType == 'Thread':pop.ObjV = np.array(list(self.pool.map(subAimFunc, args)))elif self.PoolType == 'Process':result = self.pool.map_async(subAimFunc, args)result.wait()pop.ObjV = np.array(result.get())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))def subAimFunc(args):i = args[0]Vars = args[1]data = args[2]dataTarget = args[3]C = Vars[i, 0]G = Vars[i, 1]svc = svm.SVC(C=C, kernel='rbf', gamma=G).fit(data, dataTarget) # 创建分类器对象并用训练集的数据拟合分类器模型scores = cross_val_score(svc, data, dataTarget, cv=30) # 计算交叉验证的得分ObjV_i = [scores.mean()] # 把交叉验证的平均得分作为目标函数值return ObjV_i

源代码

这篇关于利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515014

相关文章

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C#使用SendMessage实现进程间通信的示例代码

《C#使用SendMessage实现进程间通信的示例代码》在软件开发中,进程间通信(IPC)是关键技术之一,C#通过调用WindowsAPI的SendMessage函数实现这一功能,本文将通过实例介绍... 目录第一章:SendMessage的底层原理揭秘第二章:构建跨进程通信桥梁2.1 定义通信协议2.2

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建