《机器学习》—— 支持向量机(SVM)实现二分类问题

news2024/12/23 10:33:10

文章目录

  • 一、什么是支持向量机(SVM)
    • 1、SVM两个基本概念
    • 2、SVM的原理
  • 二、示例:支持向量机(SVM)实现二分类问题
    • 1、先选取两个特征,并进行可视化
    • 2、选取所有的特征传入模型,并对模型进行评估

一、什么是支持向量机(SVM)

  • 机器学习中的SVM(Support Vector Machine,支持向量机)是一种监督学习算法,广泛应用于分类和回归分析中。它的基本思想是通过找到一个最优超平面来最大化不同类别之间的间隔,从而实现对数据的分类。

1、SVM两个基本概念

  • 支持向量:支持向量是离超平面最近的那些样本点,它们对于确定超平面的位置和方向至关重要。

  • 超平面:在二维空间中,超平面是一条直线;在三维空间中,它是一个平面;在更高维的空间中,它是一个超平面。SVM的目标是找到一个最优超平面,使得不同类别的样本点能够尽可能地被分开,并且这个超平面与最近的样本点(即支持向量)之间的距离最大化。

2、SVM的原理

  • 线性可分情况

    • 当数据线性可分时,SVM的目标是找到一个最优超平面,将两个不同类别的样本点完全分开,并且这个超平面与最近的样本点(支持向量)之间的距离最大化。这个距离被称为间隔
    • SVM通过计算样本点到超平面的距离来定义间隔,并尝试最大化这个间隔,从而增强分类器的鲁棒性和泛化能力。
  • 非线性可分情况

    • 当数据非线性可分时,SVM引入了核函数的概念。核函数能够将样本从原始特征空间映射到更高维的特征空间,使得数据在新的空间中线性可分。
    • 常用的核函数包括线性核多项式核高斯核(径向基函数)等。这些核函数允许SVM处理更复杂的非线性分类问题。

二、示例:支持向量机(SVM)实现二分类问题

  • 下面是一个含有100个样本,且每个样本都含有4个特征的数据集
  • 为了方便获取数据,这个数据集被刻意处理过,前50个样本标签为0,后50个样本标签为1
  • 这些样本被分为两个标签类,分别是0和1
  • 第一列为每个样本的序列值没有作用,获取数据时要跳过它,最后一列为标签列
    在这里插入图片描述
  • 由于这个数据每个样本都有4个特征,属于四维空间,无法进行可视化展示,所以我们先选取其中的两个特征进行可视化展示和构建模型训练,再通过所有的特征构建模型,并对模型进行评估

1、先选取两个特征,并进行可视化

  • 1、获取数据并可视化原始数据

    import pandas as pd
    """获取数据"""
    data = pd.read_csv('iris.csv', header=None)
    
    """可视化原始数据"""
    import matplotlib.pyplot as plt
    
    data1 = data.iloc[:50, :]
    data2 = data.iloc[50:, :]
    
    # 原始数据是四维,无法展示,选择两个特征进行展示
    plt.scatter(data1[1], data1[3], marker='+')
    plt.scatter(data2[1], data2[3], marker='o')
    plt.show()
    

    在这里插入图片描述

  • 2、使用SVM进行训练

    • SVC() 是 Scikit-learn(一个流行的 Python 机器学习库)中用于实现支持向量分类(Support Vector Classification, SVC)的一个类。SVC 是一种基于监督学习的分类算法,它试图找到一个超平面来最大化不同类别之间的间隔,从而实现分类。
    • SVC()有以下一些参数:
      • kernel:字符串,指定要在算法中使用的核函数类型。常用的核函数包括 ‘linear’(线性核)、‘poly’(多项式核)、‘rbf’(径向基函数核,也称为高斯核)、‘sigmoid’(双曲正切核)等。默认值是 ‘rbf’。
      • C:浮点数,正则化参数 C 的大小。C 的值越大,对错误分类的惩罚就越大,这可能导致过拟合。C 的值越小,对错误分类的惩罚就越小,这可能导致欠拟合。默认值是 1.0。
      • degree:整数,当使用多项式核时,该参数指定多项式的维度。默认值是 3。
      • gamma:浮点数,‘rbf’、‘poly’ 和 ‘sigmoid’ 核的系数。对于 ‘rbf’ 核,gamma 是核函数中的系数(exp(-gamma * ||x-y||^2));对于 ‘poly’ 和 ‘sigmoid’ 核,gamma 用于定义核函数中的 coef0。默认值是 ‘scale’ 或 ‘auto’,这意呀着 Scikit-learn 将自动选择 gamma 的值。
      • coef0:浮点数,仅当使用 ‘poly’ 和 ‘sigmoid’ 核时有用。它是核函数中的独立项。默认值是 0.0。
      • tol:浮点数,停止训练的容差。默认值是 1e-3。
      • max_iter:整数,求解器中的最大迭代次数(对于 ‘newton-cg’、‘sag’ 和 ‘lbfgs’ 求解器)。默认值是 -1,表示无限制。
      • class_weight:字典或字符串,指定类别权重。如果给出字典,则可以直接为不同的类别指定不同的权重;如果给出字符串 ‘balanced’,则算法会自动调整权重,使得每个类别的权重与其样本数成反比。默认值是 None,表示所有类别的权重都相等。
      • probability:布尔值,是否启用概率估计。这必须在训练模型之前启用,并且会减慢训练速度,因为它需要使用 5-fold 交叉验证。默认值是 False。
      from sklearn.svm import SVC
      
      x = data.iloc[:, [1, 3]]  # 获取第1,3特征作为训练数据
      y = data.iloc[:, -1]   # 获取最后一列标签列
      # 因为这里样本数量不是很多,可以使用C的默认值1,也可以适当增加,来观察模型效果的变化
      svm = SVC(kernel='linear', C=1.0, random_state=0)
      svm.fit(x, y)  # 传入数据进行训练
      
  • 3、可视化SVM结果

    • svm.coef_[0] 表示的是SVM模型中第一个决策函数的权重系数

    • svm.intercept_[0] 表示的是SVM模型中第一个决策函数的截距项

    • svm.support_vectors_ 是支持向量机(SVM)模型中的一个重要属性,它包含了模型中的所有支持向量。支持向量是那些位于决策边界上或非常接近决策边界的训练数据点,它们对于定义决策边界至关重要。在SVM中,决策边界完全由这些支持向量决定,而非支持向量的数据点对决策边界的位置没有任何影响。

      # 参数w[原始数据为二维数组]
      w = svm.coef_[0]
      # 偏置项b[原始数据为一维数组]
      b = svm.intercept_[0]
      # 超平面方程:w1*x1+w2*x2+b=0
      # --> x2 = -(w1*x1+b)/w2
      
      import numpy as np
      
      # 在0~7之间产生300个数据
      x1 = np.linspace(0, 7, 300)
      # 超平面方程
      x2 = -(w[0] * x1 + b) / w[1]  # 计算得到x2
      # 上超平面方程
      x3 = (1 - (w[0] * x1 + b)) / w[1]
      # 下超平面方程
      x4 = (-1 - (w[0] * x1 + b)) / w[1]
      
      # 可视化超平面
      plt.plot(x1, x2, linewidth=2, color='r')
      plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
      plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
      # 进行坐标轴限制
      plt.xlim(4, 7)
      plt.ylim(0, 5)
      
      # 找到支持向量[二维数组],可视化支持向量
      vets = svm.support_vectors_
      plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
      plt.show()
      

      在这里插入图片描述

2、选取所有的特征传入模型,并对模型进行评估

  • 1、获取数据并划分数据集
import pandas as pd
# 读取数据
data = pd.read_csv('iris.csv', header=None)

x = data.iloc[:, 1:-1] # 读取所有的样本作为数据集
y = data.iloc[:, -1]   # 读取标签列

from sklearn.model_selection import train_test_split
# 切出20%的数据作为测试集,其余的作为训练集,并抛出一个随机种子,为了后面每次运行所划分的数据都与第一次相同
x_train, x_test, y_train, y_test = \
    train_test_split(x, y, test_size=0.2, random_state=0)
  • 2、使用SVM进行训练
from sklearn.svm import SVC
# 因为是多维的数据,所以选取的核函数为 rbf 或 poly
svm = SVC(kernel='rbf', C=1.0, random_state=0)
svm.fit(x_train, y_train)  # 传入训练集进行训练
  • 3、传入测试集进行测试,并进行评估
from sklearn import metrics
# 传入训练集进行测试
test_score = svm.score(x_test, y_test)
print(test_score)
# 评估模型
test_predict = svm.predict(x_test)
print(metrics.classification_report(y_test, test_predict))
  • 结果如下:
    在这里插入图片描述
    • 由结果可以看出, 支持向量机(SVM)在小样本训练集的二分类问题上可以得到非常好的效果

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

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

相关文章

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出 文章目录 一、基本原理1. 基本原理核极限学习机(KELM) 2. NGO-KELM回归预测流程1. 数据预处理2. 核极限学习机(KELM)模型构建3. 北方苍鹰优…

【Tomcat+MySQL+Redis源码安装三件套】

TomcatMySQLRedis源码安装三件套 Tomcat部分概念Tomcat的作用Tomcat的原理Linux运维中的应用场景具体操作示例 基本使用流程实验Tomcat安装tomcat的反向代理及负载均衡源地址hash(不能负载)tomcat负载均衡实现(使用cookie) memcached 操作命令 理论补充结…

大数据系统测试——大数据系统解析(上)

各位好,我是 道普云 欢迎关注我的主页 希望这篇文章对想提高软件测试水平的你有所帮助。 在本文中我们一起来看一下大数据系统每一个层次需要解决的技术问题和对应的一些技术需求。以此来作为学习大数据系统测试的基础。 数据收集层主要是进行数据源的分布式、…

sqli-labs靶场通关攻略 31-35

主页有sqli-labs靶场通关攻略 1-30 第三一关 less-31 闭合方式为?id1&id1 ") -- 步骤一:查看数据库名 http://127.0.0.1/less-31/?id1&id-1%22)%20union%20select%201,database(),3%20-- 步骤二:查看表名 http://127.0.0.1/less-31/?…

Redis 实现哨兵模式

目录 1 哨兵模式介绍 1.1 什么是哨兵模式 1.2 sentinel中的三个定时任务 2 配置哨兵 2.1 实验环境 2.2 实现哨兵的三条参数: 2.3 修改配置文件 2.3.1 MASTER 2.3.2 SLAVE 2.4 将 sentinel 进行备份 2.5 开启哨兵模式 2.6 故障模拟 3 在整个架构中可能会出现的问题 …

【FastAPI】—— 01 创建FastAPI项目

1.FastAPI框架介绍 FastAPI是⼀个现代、快速(⾼性能)的Web框架,⽤于构建API。是建⽴在Starlette和Pydantic基础上的。它基于Python3.7的类型提示(typehints)和异步编程(asyncio)能⼒&#xff0c…

软件设计原则之开闭原则

开闭原则(Open-Closed Principle, OCP)是软件设计中的一个重要原则,由伯特兰梅耶(Bertrand Meyer)在1988年提出。该原则强调软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭…

【机器学习】 7. 梯度下降法,随机梯度下降法SGD,Mini-batch SGD

梯度下降法,随机梯度下降法SGD,Mini-batch SGD 梯度下降法凸函数(convex)和非凸函数梯度更新方向选择步长的选择 随机梯度下降SGD(Stochastic Gradient Descent)梯度下降法:SGD: Mini-batch SGD 梯度下降法 从一个随机点开始决定下降方向(重要&#xff…

关于kafka的分区和消费者之间的关系

消费者和消费者组 当生产者向 Topic 写入消息的速度超过了消费者(consumer)的处理速度,导致大量的消息在 Kafka 中淤积,此时需要对消费者进行横向伸缩,用多个消费者从同一个主题读取消息,对消息进行分流。 …

【JVM】OOM与调优(二)

OOM与调优 6.JVM工具如jps 该命令是纯Java编写的 -q:只显示Java进程的ID -m:输出Java进程的ID main函数所在类的名字 传递给main函数的参数 -l:输出Java进程的IDmain函数所在类的全限定名(包名类名) -v:输出Java进程的IDmain函数所在类的名称传递给JVM的参数 应用&am…

在野漏洞的应急响应流程

许多时候,对于负责安全工作又不太擅长安全漏洞技术的人员而言,如何应对突发漏洞是工作中主要的难点,这里的突发漏洞指的是两类:一类是通过新闻、咨询推送,被社会舆论所有关注的CVE漏洞,比如前段时间所谓的核…

【YOLOv10改进[Conv]】感受野注意力卷积RFAConv(2024.3)| 使用RFAConv 改进v10目标检测效果 + 含全部代码和详细修改方式

本文将进行在YOLOv10中使用RFAConv,助力YOLOv10目标检测效果,文中含全部代码、详细修改方式。助您轻松理解改进的方法。

手撕M.2 的B-KEY M-KEY、M+B KEY定义

SSD 尺寸与规格 我们在买ssd的时候,商家都会说什么ssd是2280还是2242规格的,这里的规格实际上就是代表的ssd的尺寸大小 M.2模组的尺寸目前有11种,用Type xxyy的方式表示,xx表示宽度,yy表示长度,单位为毫米。例如上面提…

(mcu) 嵌入式基础简单入门(程序架构分析)

文章目录 💽前言💽软件框架📀工具环境📀模板工程📀编译后📀Code📀典例举例 💽Keil 使用notes⭐END🌟关注我 💽前言 本文为一份简单入门笔记,以 st…

算法-单词规律(290)

leetcode题目链接 这道题用哈希表来解决 一个哈希表存放从单词到字符的映射,一个存放从字符到单词的映射,依照空格分隔字符,并将每个字符存放到vector字符数组, 遍历 pattern,对于每个字符 c 和对应的单词 w&#xf…

带你快速了解WEB应用服务器TOMCAT

目录 一、WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二 WEB框架 2.1 web资源和访问 2.2 后台应用架构 2.2.1 单体架构 2.2.2 微服务 2.2.3 单体架构和…

机器学习 第6章 支持向量机

这里写目录标题 6.1 间隔与支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归 6.1 间隔与支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , 1 } D\left \{ (x_{1},y_{1}),(x_{2},y_{2}) ,...,(x_{…

禹晶、肖创柏、廖庆敏《数字图像处理》Otsu方法描述勘误

最大化类间距离准则与最小错误率准则不等价。 虚线处为最大类间距离,前景与背景直方图的交界处为最小错分概率,当部分前景错分为背景或者部分背景错分为前景时,一般会导致类间距离变小。所以两者接近,但不相等。 禹晶、肖创柏、…

《Spring Boot 集成 Swagger:打造高效接口文档与开发体验》

Swagger 一.导语: ​ 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后…

MindSearch 部署

任务 按照教程,将 MindSearch 部署到 HuggingFace 并美化 Gradio 的界面,并提供截图和 Hugging Face 的Space的链接。 创建开发机 & 环境配置 mkdir -p /root/mindsearch cd /root/mindsearch git clone https://github.com/InternLM/MindSearch.…