【数据挖掘】基于粒子群算法优化支持向量机PSO-SVM对葡萄酒数据集进行分类

news2024/10/8 22:15:44

1.粒子群算法的概念

PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法是模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方法寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断的改变其搜索方式。PSO由于操作简单、收敛速度快、并没有许多参数的调节,因此,被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

2.粒子群算法的原理

粒子群优化算法的基本思想是通过群体中个体之间的协作和信息共享来寻找最优解。用一种粒子模拟种群个体,每个粒子可视为N维搜索空间中的一个搜索个体,粒子的当前位置即为对应优化问题的一个候选解,粒子的飞行过程即为该个体的搜索过程。粒子的飞行速度可根据粒子历史最优位置和种群历史最优位置进行动态调整。粒子仅有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子单独搜寻的最优解叫做个体极值,粒子群中的最优个体极值作为当前全局的最优解。不断迭代,更新速度和位置。最终得到满足条件的最优解。流程如下:
在这里插入图片描述

PSO算法的步骤为:
(1)初始化所有粒子,即给它们的速度和位置赋值,并将个体的历史最优pBest设为当前位置,群体中的最优个体作为当前的gBest。
(2)在每一代的进化中,计算各个粒子的适应度函数值。
(3)如果当前适应度函数值优于历史最优值,则更新pBest。
(4)如果当前适应度函数值优于全局历史最优值,则更新gBest。
(5)对每个粒子i的第d维的速度和位置分别按照如下公式进行更新。其中w为惯量权重,一般初始化为0.9,随着进化过程线性递减到0.4;c1和c2是加速系数,传统上取固定值2.0;rand1和rand2是两个[0,1]区间上的随机数。
在这里插入图片描述

3.基于PSO-SVM对葡萄酒数据集进行分类

上面我们对粒子群算法PSO进行了原理介绍,接下来,我们将对SKlearn自带葡萄酒数据集进行分类,采用的分类算法为支持向量机(Support Vector Machine,SVM),通过PSO优化SVM的重要超参数c和g,寻找使模型效果最好的超参数c和g。从随机解出发,通过迭代寻找最优解,通过适应度来评价解的质量。PSO初始化为一群随机粒子,然后通过迭代找到最优解。所有的粒子具有位置(particle_position_vector)和速度(velocity_vector)两个属性。在每一次迭代中,粒子通过粒子本身所找到的最优解pbest和整个种群目前找到的最优解全局极值gbest来更新。接下来,我们直接上代码,查看整个过程。
第一步:导入相应的宝并查看葡萄酒数据集合

# 导入相应的包
import pandas as pd
import numpy as np
import random
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris,load_wine
# 读取训练数据
x,y = load_wine(return_X_y=True)
x,Y = pd.DataFrame(x),pd.DataFrame(y)
x.shape,Y.shape

在这里插入图片描述
第二步,标准化或者归一化数据集,加快收敛,提升分类精度。

# 标准化
scaler = StandardScaler()
X = scaler.fit_transform(x)

第三步,初始化模型参数。

W = 0.5                                 # 惯性因子
c1 = 0.2                                # 学习因子
c2 = 0.5                                # 学习因子
n_iterations = 10                       # 迭代次数
n_particles = 80                       # 种群规模

第四步,设置适应度值,输出分类精度,并返回混淆矩阵错误结果分类情况。

def fitness_function(position):
    svclassifier = SVC(kernel='rbf',gamma=position[0],C=position[1])
    # 参数gamma和惩罚参数C以实数向量的形式进行编码作为pso粒子的位置
    svclassifier.fit(X,y)
    score = cross_val_score(svclassifier,X,y,cv=10).mean()# 交叉验证的精度
    print("分类精度:",score)
    Y_pred = cross_val_predict(svclassifier,X,y,cv=10)
    
    return confusion_matrix(Y, Y_pred)[0][1] + confusion_matrix(Y, Y_pred)[0][2] + confusion_matrix(Y, Y_pred)[1][0] + \
           confusion_matrix(Y, Y_pred)[1][2] + confusion_matrix(Y, Y_pred)[2][0] + confusion_matrix(Y, Y_pred)[2][1]\
        ,  confusion_matrix(Y, Y_pred)[0][1] + confusion_matrix(Y, Y_pred)[0][2] + confusion_matrix(Y, Y_pred)[1][0] + \
           confusion_matrix(Y, Y_pred)[1][2] + confusion_matrix(Y, Y_pred)[2][0] + confusion_matrix(Y, Y_pred)[2][1]

第五步,初始化粒子位置(particle_position_vector)和粒子速度(velocity_vector)

# 粒子位置向量
particle_position_vector = np.array([np.array([random.random() * 10, random.random() * 10]) for _ in range(n_particles)])
pbest_position = particle_position_vector    #个体极值等于最初位置
pbest_fitness_value = np.array([float('inf') for _ in range(n_particles)])   #个体极值的适应度值
gbest_fitness_value = np.array([float('inf'), float('inf')])    #全局极值的适应度值
gbest_position = np.array([float('inf'), float('inf')])
velocity_vector = ([np.array([0, 0]) for _ in range(n_particles)])  # 粒子速度

第六步,开始迭代

iteration = 0
while iteration < n_iterations:
    # plot(particle_position_vector)  #  粒子具体位置
    for i in range(n_particles):   # 对每个粒子进行循环
        fitness_cadidate = fitness_function(particle_position_vector[i])   # 每个粒子的适应度值=适应度函数(每个粒子的具体位置)
        # print("粒子误差", i, "is (training, test)", fitness_cadidate, " At (gamma, c): ",
              # particle_position_vector[i])

        if (pbest_fitness_value[i] > fitness_cadidate[1]):    # 每个粒子的适应度值与其个体极值的适应度值(pbest_fitness_value)作比较,如果更优的话,则更新个体极值,
            pbest_fitness_value[i] = fitness_cadidate[1]
            pbest_position[i] = particle_position_vector[i]

        if (gbest_fitness_value[1] > fitness_cadidate[1]):   # 更新后的每个粒子的个体极值与全局极值(gbest_fitness_value)比较,如果更优的话,则更新全局极值
            gbest_fitness_value = fitness_cadidate
            gbest_position = particle_position_vector[i]

        elif (gbest_fitness_value[1] == fitness_cadidate[1] and gbest_fitness_value[0] > fitness_cadidate[0]):
            gbest_fitness_value = fitness_cadidate
            gbest_position = particle_position_vector[i]

    for i in range(n_particles):  # 更新速度和位置,更新新的粒子的具体位置
        new_velocity = (W * velocity_vector[i]) + (c1 * random.random()) * (
                    pbest_position[i] - particle_position_vector[i]) + (c2 * random.random()) * (
                                   gbest_position - particle_position_vector[i])
        new_position = new_velocity + particle_position_vector[i]
        particle_position_vector[i] = new_position

    iteration = iteration + 1

在这里插入图片描述
第七步,输出最终的分类结果

print("全局最优点的位置是 ", gbest_position, "在第", iteration, "步迭代中(训练集,测试集)错误个数:", fitness_function(gbest_position))

在这里插入图片描述
第八步,我们将PSO得到的最优参数组合带入SVM,进行验证,如下:

# 进行验证
svclassifier_ = SVC(kernel='rbf',gamma=0.1412017,C=3.87776386)
svclassifier_.fit(X,y)
score = cross_val_score(svclassifier_,X,y,cv=10).mean()
print("验证后的结果为:",score)

在这里插入图片描述
至此,我们完成了通过PSO优化SVM算法,提升其在葡萄酒数据集上的分类效果。

4.总结

本篇,介绍了PSO优化算法的原理与迭代步骤,并采用PSO粒子群优化算法寻找支持向量机SVM算法的最佳参数进行分类,并取得了很好的模型效果,供大家参考学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国电子学会2021年03月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2021-03Scratch三级真题 分数&#xff1a;100题数&#xff1a;38 一、单选题(共25题&#xff0c;每题2分&#xff0c;共50分) 1.在《采矿》游戏中&#xff0c;当角色捡到黄金时财富值加1分&#xff0c;捡到钻石时财富值加2分&#xff0c;下面哪个程序实现这个功能&#xff1…

【软件测试】资深测试总结的测试必备8点,堪称测试人的好莱坞大片......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试8板斧。测试8板…

Task8:Excel的数据可视化

目录一 条形图二 条件单元格格式三 迷你图四 练习题一 条形图 【例子】直观的展示销售额之间的差别 方法&#xff1a;【开始】–>【条件格式】–>【数据条】 【只想显示条形图&#xff0c;不想显示金额】 1.条形图区域—>条件格式—>管理规则 2.选择设置的规则&a…

单应性Homography梳理,概念解释,传统方法,深度学习方法

Homography 这篇博客比较清晰准确的介绍了关于刚性变换&#xff0c;仿射变换&#xff0c;透视投影变换的理解 单应性变换 的 条件和表示 用 [无镜头畸变] 的相机从不同位置拍摄 [同一平面物体] 的图像之间存在单应性&#xff0c;可以用 [透视变换] 表示 。 opencv单应性变换求…

Active Directory计算机备份和恢复

在Active Directory&#xff08;AD&#xff09;环境中&#xff0c;用户通过域中的计算机认证他们自身。从AD中删除这些计算机账户时&#xff0c;系统也会自动从域中删除它们。于是&#xff0c;用户不能再通过些计算机登录网络。为允许用户访问域资源&#xff0c;必须恢复这些已…

聚集千百个企业管理系统的API资产,打造API资产全生命周期一站式集成体验

API——接口&#xff0c;作为软件世界中的连接服务和传输数据的重要管道&#xff0c;已经成为数字时代的新型基础设施&#xff0c;是各领域驱动数字变革的重要力量之一。传统企业集成主要采用点对点或ESB集成方式&#xff0c;基于全新API战略中台的API新型集成方式通过解耦系统…

SpringBoot跨域请求解决方案详细分析

跨域的定义 跨域是指不同域名之间的相互访问&#xff0c;这是由浏览器的同源策略决定的&#xff0c;是浏览器对JavaScript施加的安全措施&#xff0c;防止恶意文件破坏。同源策略&#xff1a;同源策略是一种约定&#xff0c;它是浏览器最核心的也是最基本的安全策略&#xff0…

【数据产品】缓存设计

背景&#xff1a;为什么需要做缓存&#xff1f; 我所做的产品的指标设计越来越复杂&#xff0c;查询性能也随之下降。因此需要增加缓存层&#xff0c; 以提高接口查询效率。 哪些层需要做缓存&#xff1f; 随着指标系统的应用&#xff0c;该产品的查询逻辑也越来越简单&…

二分查找核心思路--单调性--极值

在最初的二分查找中&#xff0c;我们将一组数据按大小排序&#xff0c;然后根据arr[mid]与要查找的k的大小比较&#xff0c;从而每次去掉一半的数字&#xff0c;使时间复杂度简化为O&#xff08;logN&#xff09;。 排序本质上是让数据的单调性统一&#xff0c;变为单增或单减…

spring中的JSR-303统一校验

1.在前后端的传输参数的过程中数据在何处校验? 在前后端都需要进行校验,只是分工不同. 2.各个层的校验内容: 1.Controller层主要负责校验残水的合法性,包括: 必填的参数字段,数据格式的校验 2.Service层的业务校验是审核业务中的规则的相关内容,比如:课程已经审核通过所以提…

vue3 为何比 vue2 快

vue3 为何比 vue2 快 测试环境&#xff1a;https://vue-next-template-explorer.netlify.app/ 1、proxy 响应式 vue3 优缺点&#xff1a; 深度监听性能更好可监听 新增 / 删除 属性可监听数组变化Proxy 能规避 Object.defineProxy 的问题Proxy 无法兼容所有浏览器&#xff…

OAuth2介绍

目录 一、什么是OAuth2 二、OAuth2中的角色 三、认证流程 四、令牌的特点 五、OAuth2授权方式 授权码 隐藏方式 密码方式 凭证方式 一、什么是OAuth2.0 概念&#xff1a;第三方授权解决方案 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取…

[NRF52] mesh DFU

mesh DFU升级过程&#xff1a;完整流程&#xff1a;以前nRF SDK DFU的实现是通过nRF51 Dongle配合主机nRF connect工具&#xff0c;且借助Secure DFU的后台式更新速率较快&#xff08;见另一篇笔记&#xff09;&#xff0c;现在的nRF mesh DFU分角色&#xff0c;全都由DK充当&a…

什么是单体应用?什么是微服务?

Monolith&#xff08;单体应用&#xff09;&#xff0c; 也称之为单体系统或者是 单体架构 。就是一种把系统中所有的功能、模块、组件等耦合在一个应用中应用最终打成一个(war,jar)包使用一个容器(Tomcat)进行部署&#xff0c;通常一个应用享用一个数据库。 也就是将所有的代码…

Java版数据结构与算法笔记

文章目录一、数据结构与算法概述及题目1、数据结构和算法的关系2、线性结构与非线性结构Ⅰ-线性结构Ⅱ-非线性结构3、经典面试题Ⅰ-字符串匹配问题&#xff1a;Ⅱ-汉诺塔游戏Ⅲ-八皇后问题:Ⅳ-马踏棋盘算法4、几个实际编程中遇到的问题Ⅰ-字符串替换问题Ⅱ-一个五子棋程序Ⅲ-约…

这家芯片企业,从创立之初就用 Authing 管理身份

在德州仪器和苹果的经验&#xff0c;让我深知统一身份管理要从 Day 1 做起。——Alpha Cen 联合创始人 & CEO 王璠 案例亮点&#xff1a; 打通 2000 主流应用、满足芯片初创企业统一身份需求 一周快速上线&#xff0c;产品开箱即用&#xff0c;后续无需费力运维 基于协同…

Pytorch安装及环境配置详细教程(CUDA版本)

文章目录前言一、查看GPU支持的CUDA版本二、安装CUDA三、确定torch、torchvision和python版本四、安装anaconda五、安装torch和torchvision前言 安装cuda版本的pytorch时踩了不少坑&#xff0c;网上安装pytorch的版本很多&#xff0c;一般的教程都是到pytorch的官网&#xff0…

相比传统专线网络,爱快、飞连等主流SD-WAN方案好在哪里?

当企业发展至一定的规模后&#xff0c;移动办公、异地办公会逐渐成为刚需&#xff0c;这就对企业的网络架构提出了新的挑战。 一般来说&#xff0c;企业在发展中所遇到的这些新增的网络需求&#xff0c;有两种比较常见的解决方案&#xff0c;其中之一是专线连接 。专线虽然简单…

【Unity3D插件】Build Report Tool插件,Build报告,优化包体,查看资源占用

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章介绍一下Build Report Tool插件的使用。 Build Repor…

在Visual Studio中调试Linux控制台程序

最近&#xff0c;Visual Studio 2022 17.5 预览版3 面向广大 Linux 开发者提供了一项新特性&#xff1a;在 Visual Studio 集成的终端中调试 C Linux 控制台程序。 如需了解更多关于集成终端的功能以及它在 Visual Studio 中的工作原理&#xff0c;请参考我们之前的一篇文章: I…