Scikit-Learn支持向量机分类

news2024/12/23 14:01:27

Scikit-Learn 支持向量机分类

    • 1、支持向量机(SVM)
      • 1.1、SVM概述
      • 1.2、SVM原理
      • 1.3、SVM的损失函数
      • 1.4、支持向量机分类的优缺点
    • 2、Scikit-Learn支持向量机分类
      • 2.1、Scikit-Learn支持向量机分类API
      • 2.2、支持向量机分类初体验(手写数字识别)
      • 2.3、支持向量机分类案例




1、支持向量机(SVM)

1.1、SVM概述


在机器学习中,支持向量机(Support Vector Machine,SVM)算法既可以用于回归问题(SVR),也可以用于分类问题(SVC)

支持向量机是一种经典的监督学习算法,通常用于分类问题。SVM在机器学习知识结构中的位置如下:

SVM的核心思想是将分类问题转化为寻找分类平面的问题,并通过最大化分类边界点(支持向量)到分类平面的距离(间隔)来实现分类

在这里插入图片描述

如图所示,左图展示了三种可能的线性分类器的决策边界,虚线所代表的模型表现非常糟糕,甚至都无法正确实现分类;其余两个模型在训练集上表现堪称完美,但是它们的决策边界与实例过于接近,导致在面对新样本时,表现可能不会太好

右图中的实线代表SVM分类器的决策边界,两虚线表示最大间隔超平面,虚线之间的距离(两个异类支持向量到超平面的距离之和)称为超平面最大间隔,简称间隔;SVM的决策边界不仅分离了两个类别,而且尽可能的远离了最近的训练实例,距离决策边界最近的实例称为支持向量

1.2、SVM原理


SVM的最优化问题就是要找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面的方程为
ω T x + b = 0 \omega^Tx+b=0 ωTx+b=0

其中 ω \omega ω为超平面的法向量,决定了超平面的方向; b b b为位移项,决定了超平面到原点间的距离

二维空间点 ( x , y ) (x,y) (x,y)到直线 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0的距离公式为
d = ∣ A x + B y + C ∣ A 2 + B 2 d=\frac{|Ax+By+C|}{\sqrt{A^2+B^2}} d=A2+B2 Ax+By+C

扩展到N维空间中,点 ( x 1 , x 2 , . . . x n ) (x_1,x_2,...x_n) (x1,x2,...xn)到直线 ω T x + b = 0 \omega^Tx+b=0 ωTx+b=0的距离为
d = ∣ ω T x + b ∣ ∣ ∣ ω ∣ ∣ d=\frac{|\omega^Tx+b|}{||\omega||} d=∣∣ω∣∣ωTx+b

其中, ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣= ω 1 2 + ω 2 2 + . . . + ω n 2 \sqrt{\omega_1^2+\omega_2^2+...+\omega_n^2} ω12+ω22+...+ωn2

在这里插入图片描述
SVM假设样本是线性可分的,则任意样本点到超平面的距离可写为
d = ∣ ω T x + b ∣ ∣ ∣ ω ∣ ∣ d=\frac{|\omega^Tx+b|}{||\omega||} d=∣∣ω∣∣ωTx+b
为方便描述和计算,设 y i ∈ − 1 , 1 y_i\in{-1,1} yi1,1,其中1表示正例,-1表示负例,则有
{ ω T x i + b ≥ + 1    y i = + 1 ω T x i + b ≤ − 1    y i = − 1 \begin{cases} \omega^Tx_i + b ≥ +1 \, \, & y_i=+1 \\ \omega^T x_i+b ≤ -1 \, \, & y_i=-1 \end{cases} {ωTxi+b+1ωTxi+b1yi=+1yi=1

此时,两个异类支持向量到超平面的距离之和为
γ i = y i ( ω T ∣ ∣ ω ∣ ∣ ⋅ x i + b ∣ ∣ ω ∣ ∣ ) = 2 ∣ ∣ ω ∣ ∣ \gamma_i=y_i\left(\frac{\omega^T}{||\omega||}\cdot x_i + \frac{b}{||\omega||} \right) = \frac{2}{||\omega||} γi=yi(∣∣ω∣∣ωTxi+∣∣ω∣∣b)=∣∣ω∣∣2

其中, γ \gamma γ称为间隔。最大间隔不仅与 ω \omega ω有关,偏置 b b b也会隐性影响超平面的位置,进而对间隔产生影响

现在,我们只需要使间隔 γ \gamma γ最大,即
arg ⁡ max ⁡ ω , b 2 ∣ ∣ ω ∣ ∣ \arg \mathop{\max}\limits_{\omega,b} \frac{2}{||\omega||} argω,bmax∣∣ω∣∣2

最大化间隔 γ \gamma γ,显然只需要最小化 ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣,于是,上式可重写为
arg ⁡ min ⁡ ω , b 1 2 ∣ ∣ ω ∣ ∣ 2 \arg \mathop{\min}\limits_{\omega,b} \frac{1}{2}||\omega||^2 argω,bmin21∣∣ω2

这里的平方和之前一样,一是为了方便计算,二是可以将目标函数转化为凸函数的凸优化问题。称该式为SVM的基本型

1.3、SVM的损失函数


1.3.1、软间隔与硬间隔

如果我们严格让所有实例都不在最大间隔之间,并且位于正确的一边,这就是硬间隔分类。但是硬间隔分类有两个问题:首先,它只在数据是线性可分时才有效;其次,它对异常值较敏感

要避免这些问题,可以使用更灵活的模型。目标是尽可能在保持最大间隔的同时允许间隔违例(在最大间隔之间,甚至位于错误的一边),在最大间隔与违例之间找到良好的平衡,这就是软间隔分类

在这里插入图片描述
软间隔的目标函数为
J = 1 2 ∣ ∣ ω ∣ ∣ 2 + C ∑ i = 1 n ε i J=\frac{1}{2}||\omega||^2 + C\sum_{i=1}^{n}\varepsilon_i J=21∣∣ω2+Ci=1nεi
其中,超参数 C C C为惩罚系数, ε \varepsilon ε为松弛因子。 C C C越小,惩罚越小(间隔越宽,违例越多)

1.3.2、核函数

对于非线性数据集,线性支持向量机无法处理。我们希望将非线性问题转化为线性可分问题来求解。这时,需要引入一个新的概念:核函数

核函数可以将样本从原始空间映射到一个高维空间,使得样本在新的空间中线性可分

详细介绍可参考这篇文章:https://blog.csdn.net/mengjizhiyou/article/details/103437423

核函数将原始空间中的向量作为输入向量,并返回转换后的特征空间中向量的内积。通过核方法可以学习非线性支持向量机,等价于在高维特征空间中学习线性支持向量机

所以在非线性SVM中,核函数的选择就是影响SVM最大的变量。常用核函数有:线性核、多项式核、高斯核、拉普拉斯核和Sigmoid核等

在这里插入图片描述

1.4、支持向量机分类的优缺点


优点:

  • 可适用于处理高维空间数据,对于数据维度远高于样本数据量的情况也有效
  • 在决策函数中使用少部分训练数据(支持向量)进行决策,内存占用小,效率高
  • 通过支持向量选取最优决策边界,对噪声和异常值的敏感度较低,稳定性较好
  • 更加通用,可处理非线性分类任务,提供了多种通用核函数,也支持自定义核函数

缺点:

  • 解释性差:不像K-Means、决策树那样直观,不易于理解,可解释性差
  • 对参数和核函数敏感:性能高度依赖于惩罚参数C和核函数的选择。如果参数选择不当,容易导致过拟合或欠拟合
  • 非线性分类训练时间长:核函数涉及到二次规划问题,需要使用复杂的优化算法,当支持向量的数量较大时,计算复杂度较高

2、Scikit-Learn支持向量机分类

2.1、Scikit-Learn支持向量机分类API


Scikit-Learn支持向量机分类的API如下:

class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', break_ties=False, random_state=None)

官方对该API的描述为:

SVC的实现基于libsvm。SVC的拟合时间与样本数量成二次方关系,适用于样本数量较小的情况。如果样本数量过大(超过1W),建议使用其他模型,例如LinearSVCSGDClassifier。多类支持是根据One Vs One方案处理的

官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

中文官方文档:https://scikit-learn.org.cn/view/781.html

关于API参数、属性和方法详见官方文档

2.2、支持向量机分类初体验(手写数字识别)


下面使用Scikit-Learn内置的手写数字数据集演示了支持向量机分类算法在图像识别上的应用

手写数字数据集由1797个8x8像素的数字图像组成。数据集的每个图像存储为8x8灰度值的二维数组;数据集的属性存储每个图像代表的数字,这包含在图像的标题中

数据集的前4张图像可视化如下:

import matplotlib.pyplot as plt
from sklearn import datasets

# 加载手写数字数据集
data = datasets.load_digits()

_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, data.images, data.target):
    ax.set_axis_off()
    image = image.reshape(8, 8)
    ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
    ax.set_title(f"Label: {label}")

plt.show()

# 手写数字图像存储为一个8x8的二维数组
print(data.images[0])
'''
[[ 0.  0.  5. 13.  9.  1.  0.  0.]
 [ 0.  0. 13. 15. 10. 15.  5.  0.]
 [ 0.  3. 15.  2.  0. 11.  8.  0.]
 [ 0.  4. 12.  0.  0.  8.  8.  0.]
 [ 0.  5.  8.  0.  0.  9.  8.  0.]
 [ 0.  4. 11.  0.  1. 12.  7.  0.]
 [ 0.  2. 14.  5. 10. 12.  0.  0.]
 [ 0.  0.  6. 13. 10.  0.  0.  0.]]
'''

在这里插入图片描述
为了对这些数据应用分类器,我们需要将图像展平,将每个图像的灰度值从8x8的二维数组转换为64x1的一维数组

然后,我们将数据划分成训练和测试子集,并在训练样本上拟合支持向量分类器。随后再使用拟合的分类器来预测测试集中样本的数字值

from sklearn.model_selection import train_test_split

n_samples = len(data.images)
X = data.images.reshape((n_samples, -1))
y = data.target

# 划分训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

from sklearn.svm import SVC

# SVM分类器
clf = SVC()

# 训练模型
clf.fit(X_train, y_train)

# 在测试集上预测
y_pred = clf.predict(X_test)

# 平均准确度评分
print(clf.score(X_test, y_test))  # 0.9916666666666667

由模型评分结果可知,数字图像的识别准确率在测试集中表现的很好

2.3、支持向量机分类案例


预留,未完待续…



参考文章:
https://blog.csdn.net/qs17809259715/article/details/97761963
https://blog.csdn.net/Claire_chen_jia/article/details/110916001
https://blog.csdn.net/qq_53123067/article/details/136060974
https://zhuanlan.zhihu.com/p/77750026
https://www.zhihu.com/tardis/zm/art/31886934?source_id=1005


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

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

相关文章

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

创新入门|解锁您的潜在市场:探秘付费点击广告(PPC)的秘密武器

在我们的营销领域,按点击付费 (PPC) 广告是增加流量、提高知名度并最终将点击转化为客户的基石策略。这种有针对性的广告模式,即企业只在点击广告时付费,彻底改变了公司投资在线推广的方式。尽管它看起来很简单&#x…

云打印怎么下单?网上云打印下单教程来了!

近些年来,随着移动互联网的发展,云打印也越来越火热。如今有越来越多的用户选择云打印服务。但是现在仍有很多不知道如何下单。那么云打印怎么下单呢?今天小易就来和大家介绍一下网上云打印的下单教程。 云打印怎么下单?网上云打印…

fastgpt、dify功能分析比较

目录 前言 一、dify、fastgpt是什么? 二、同场pk 1.大模型接入 2.chat(最简应用) 3.发布应用 4.知识库 5.workflow 6.其他 三、一些point记录 总结 前言 现在都开始AI应用开发,何谓AI应用,起码要和AI大模型…

CMake 编译项目

一、概述 cmake 是C一个很重要的编译和项目管理工具,我们在git 上以及常见的项目现在多数都是用cmake 管理的,那么我们今天就做一个同时有Opencv和CGAL 以及PCL 的项目。 二、项目管理 重点是CMakeList.txt 1、CMakeList.txt cmake_minimum_requir…

力扣HOT100 - 104. 二叉树的最大深度

解题思路: class Solution {public int maxDepth(TreeNode root) {if (root null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }

构建云原生湖仓:Apache Iceberg与Amoro的结合实践

随着大数据技术的快速发展,企业对数据的处理和分析需求日益增长。传统的数据仓库已逐渐无法满足现代业务对数据多样性和实时性的要求,这促使了数据湖和数据仓库的融合,即湖仓一体架构的诞生。在云原生技术的推动下,构建云原生湖仓…

C语言——小知识和小细节15

一、二维数组与指针 例一 下面的程序运行结果是什么&#xff1a; #include <stdio.h>int main() {int arr[3][2] { (1,2),(3,4),(5,6) };int* p arr[0];printf("%d\n", *p);return 0; } 运行结果&#xff1a; 实际上这里有个小细节&#xff0c;就是二维数…

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》【大模型思维链】

目录 前言一、思维链介绍1-1、指令1-2、逻辑依据1-3、示例 二、Cot一般分类2-1、Zero-Shot-CoT2-2、Few-Shot-CoT 三、Cot的好处&缺陷&适用3-1、Cot的好处3-2、Cot的缺陷3-3、Cot的适用 四、变体4-1、自我验证&#xff08;self-consistency checking&#xff09; 总结 …

首发!Llama3纯本地部署攻略!中文方法!

引言 llama3在4月19日刚刚发布&#xff0c;官方的对比结果中在开源模型中堪称世界第一&#xff0c;整好周六日有时间&#xff0c;在魔搭社区上测试一下 一、启动环境 登录魔搭社区&#xff0c;到自己的机器资源&#xff0c;可以看到&#xff0c;可选的机器配置&#xff0c; …

UE5 GAS开发P31 将hud绑定在自己的角色上

在WidgetController内新建一个OverlayAuraWidgetController,然后修改HUD的初始状态 AuraHUD // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/HUD.h" #…

Ubuntu系统下 Nvidia驱动 + cuda驱动 + CuDNN安装与卸载

Ubuntu系统下 Nvidia驱动 cuda驱动 CuDNN安装与卸载 一、NVIDIA驱动与CUDA驱动的区别二、NVIDIA驱动安装与卸载1. 查看系统内核版本2. 查看显卡型号3. 查看是否有显卡驱动4. 禁用nouveau并重启5. 卸载旧版本6. 安装&#xff11;&#xff1a;使用标准Ubuntu仓库进行自动化安装…

四川易点慧电子商务抖音小店:安全正规,购物新选择

在当今互联网高速发展的时代&#xff0c;电子商务已经成为人们日常购物的重要组成部分。四川易点慧电子商务抖音小店作为新兴的电商平台&#xff0c;凭借其安全正规的经营理念和便捷高效的购物体验&#xff0c;正逐渐赢得消费者的信赖和喜爱。 一、平台背景实力雄厚 四川易点慧…

面试十八、容器适配器

容器适配器是一种特殊类型的容器&#xff0c;它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上&#xff0c;通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中&#xff0c;标准库提供了三种常见的容器适配器&#xff1a; 栈&am…

在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

文章目录 存储二进制文件为大对象步骤 1&#xff1a;创建一个大对象步骤 2&#xff1a;写入数据到大对象 检索大对象为二进制文件步骤 1&#xff1a;打开大对象以进行读取步骤 2&#xff1a;从大对象读取数据 注意事项 PostgreSQL 提供了对大对象&#xff08;Large Objects&…

JavaSE-15笔记【注解(+2024新)】

文章目录 1.注解概述2.几个常用的JDK内置的注解2.1 Deprecated2.2 Override2.3 SuppressWarnings2.4 FunctionalInterface 3.自定义注解3.1 注解也可以定义属性3.2 注解的使用规则补充 4.元注解4.1 Retention4.2 Target4.3 Documented4.4 Inherited4.5 Repeatable 5.通过反射获…

修改npm源--多种方式

2024年&#xff0c;1月22日 npm.taobao.org 域名证书已到期下线。 重置官方源 npm config set registry https://registry.npmjs.org/ 淘宝源&#xff0c;使用最新版&#xff0c;旧版停止了 npm config set registry https://registry.npmmirror.com 查看当前镜像源 npm …

精心整理的不同操作系统不同实现方案网络安全中的权限提升117种提权手法

精心整理的不同操作系统不同实现方案网络安全中的权限提升117种提权手法。 什么是网络安全中的权限提升&#xff1f; 在网络安全领域&#xff0c;了解威胁至关重要&#xff0c;而最关键的威胁之一就是特权升级的概念。从本质上讲&#xff0c;权限升级是指攻击者获得通常为高级用…

阿斯达年代记怎么下载 阿斯达年代记三强争霸下载教程

阿斯达年代记怎么下载 阿斯达年代记三强争霸下载教程 阿斯达年代记是一款三国争霸类型的游戏&#xff0c;在游戏中大家可以体验到三权争霸的刺激场景&#xff0c;在战场中大家不仅可以体验到体验到文化交织还可以感受到战场的残酷&#xff0c;本期小编将会给大家带来阿斯达年代…

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…