利用进化算法+多进程/多线程来优化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

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程