【Python/Pytorch 】-- SVM算法

news2025/4/20 4:37:06

在这里插入图片描述
文章目录

文章目录

  • 00 写在前面
  • 01 SVM算法简介
  • 02 SVM算法的基本原理
    • 线性SVM
    • 非线性SVM
  • 03 基于Python 版本的SVM算法
  • 04 优化目标表达式理解:
  • 05 约束条件表达式理解

00 写在前面

SVM算法可以结合鲸鱼算法、飞蛾扑火算法、粒子群算法、灰狼算法、蝙蝠算法等等各种优化算法一起,进行回归预测或者分类预测。

01 SVM算法简介

支持向量机(Support Vector Machine, SVM)是一种用于分类和回归分析的监督学习模型。SVM的基本思想是通过寻找一个超平面,将不同类别的样本进行最大间隔分离。SVM在高维空间中表现出色,特别适用于小样本、非线性及高维数据的分类。

02 SVM算法的基本原理

SVM的核心目标是找到一个最优分离超平面,使得不同类别的样本之间的间隔(margin)最大化。SVM分为线性SVM和非线性SVM。

线性SVM

对于线性可分的数据集,SVM通过找到一个线性超平面来分离两类数据。假设我们有一个训练数据集 ( x i , y i ) (x_i, y_i) (xi,yi),其中 x i x_i xi 是特征向量, y i ∈ { − 1 , 1 } y_i \in \{-1, 1\} yi{1,1} 是类别标签。SVM要找到一个超平面:
w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0使得所有正类样本和负类样本的间隔最大化。

目标函数
min ⁡ w , b 1 2 ∥ w ∥ 2 \min_{w,b}\frac{1}{2} \left \| w \right \| ^{2} w,bmin21w2

约束条件
y i ( w ⋅ x i + b ) ≥ 1 , ∀ i y_i (\mathbf{w} \cdot \mathbf{x_i} + b) \geq 1, \quad \forall i yi(wxi+b)1,i

通过求解上述优化问题,得到最优的权重向量 w \mathbf{w} w 和偏置 b b b,从而确定最优分离超平面。

非线性SVM

对于线性不可分的数据集,SVM使用核函数(Kernel Function)将数据映射到高维空间,使得在高维空间中可以找到线性可分的超平面。常用的核函数包括:

  • 多项式核(Polynomial Kernel):
    K ( x i , x j ) = ( x i ⋅ x j + c ) d K(x_i, x_j) = (\mathbf{x_i} \cdot \mathbf{x_j} + c)^d K(xi,xj)=(xixj+c)d

  • 高斯核(RBF核,Radial Basis Function Kernel):
    K ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 2 ) K(x_i, x_j) = \exp(-\gamma \|\mathbf{x_i} - \mathbf{x_j}\|^2) K(xi,xj)=exp(γxixj2)

  • Sigmoid核:
    K ( x i , x j ) = tanh ⁡ ( α x i ⋅ x j + c ) K(x_i, x_j) = \tanh(\alpha \mathbf{x_i} \cdot \mathbf{x_j} + c) K(xi,xj)=tanh(αxixj+c)

使用核函数后,SVM的目标函数变为:
min ⁡ w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ i \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{n} \xi_i w,bmin21w2+Ci=1nξi

约束条件
y i ( w ⋅ ϕ ( x i ) + b ) ≥ 1 − ξ i , ξ i ≥ 0 , ∀ i y_i (\mathbf{w} \cdot \phi(\mathbf{x_i}) + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad \forall i yi(wϕ(xi)+b)1ξi,ξi0,i

其中, ξ i \xi_i ξi 是松弛变量,允许误分类的样本, C C C 是惩罚参数,控制模型复杂度和误分类的权衡。

03 基于Python 版本的SVM算法

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data  # 特征数据
y = iris.target  # 类别标签

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建和训练线性核函数的SVM分类器
linear_clf = SVC(kernel='linear')
linear_clf.fit(X_train, y_train)
linear_pred = linear_clf.predict(X_test)
linear_accuracy = accuracy_score(y_test, linear_pred)
print(f'Linear Kernel Accuracy: {linear_accuracy:.2f}')

# 创建和训练多项式核函数的SVM分类器
poly_clf = SVC(kernel='poly', degree=3)
poly_clf.fit(X_train, y_train)
poly_pred = poly_clf.predict(X_test)
poly_accuracy = accuracy_score(y_test, poly_pred)
print(f'Polynomial Kernel Accuracy: {poly_accuracy:.2f}')

# 创建和训练RBF核函数的SVM分类器
rbf_clf = SVC(kernel='rbf', gamma='scale')
rbf_clf.fit(X_train, y_train)
rbf_pred = rbf_clf.predict(X_test)
rbf_accuracy = accuracy_score(y_test, rbf_pred)
print(f'RBF Kernel Accuracy: {rbf_accuracy:.2f}')

# 创建和训练Sigmoid核函数的SVM分类器
sigmoid_clf = SVC(kernel='sigmoid')
sigmoid_clf.fit(X_train, y_train)
sigmoid_pred = sigmoid_clf.predict(X_test)
sigmoid_accuracy = accuracy_score(y_test, sigmoid_pred)
print(f'Sigmoid Kernel Accuracy: {sigmoid_accuracy:.2f}')

在这里插入图片描述

04 优化目标表达式理解:

超平面的一般形式 : 在 (n) 维空间中,超平面是一个 (n-1) 维的子空间。为了更好地理解这一点,考虑几种低维情况:

  1. 在二维空间中,一个超平面是一个一维的直线。
  2. 在三维空间中,一个超平面是一个二维的平面。

法向量 w \mathbf{w} w

法向量 w \mathbf{w} w 指向超平面正交(垂直)的方向。法向量的长度 ∣ ∣ w ∣ ∣ \mathbf{||w||} ∣∣w∣∣ 影响分类间隔的大小。

偏置 b b b

偏置 b b b 决定了超平面在法向量方向上的位置。改变 b b b 的值会平行地移动超平面。具体来说,当 b b b 增加时,超平面沿法向量的方向移动,反之亦然。

x \mathbf{x} x 到超平面的距离可以通过以下公式计算:

距离 = ∣ w ⋅ x + b ∣ ∥ w ∥ \text{距离} = \frac{|\mathbf{w} \cdot \mathbf{x} + b|}{\|\mathbf{w}\|} 距离=wwx+b

这个公式的推导过程如下:

假设有一个超平面,其方程为 w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0。要计算点 x 0 \mathbf{x_0} x0 到这个超平面的距离,我们可以通过以下步骤推导出公式。

  1. 超平面的几何意义

首先,我们知道一个超平面可以通过其法向量 w \mathbf{w} w 和偏置 b b b 来定义。超平面上的点 x \mathbf{x} x 满足:

w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0

  1. 投影向量

为了找到点 x 0 \mathbf{x_0} x0 到超平面的距离,我们可以先找到从点 x 0 \mathbf{x_0} x0 到超平面的垂直投影点 x 1 \mathbf{x_1} x1。这个投影点 x 1 \mathbf{x_1} x1 可以表示为:

x 1 = x 0 − λ w \mathbf{x_1} = \mathbf{x_0} - \lambda \mathbf{w} x1=x0λw

其中, λ \lambda λ 是一个标量,表示从点 x 0 \mathbf{x_0} x0 沿着法向量 w \mathbf{w} w 的距离。我们需要找到合适的 λ \lambda λ 使得 x 1 \mathbf{x_1} x1 落在超平面上。

  1. 投影点在超平面上

由于 x 1 \mathbf{x_1} x1 在超平面上,所以必须满足超平面的方程:

w ⋅ x 1 + b = 0 \mathbf{w} \cdot \mathbf{x_1} + b = 0 wx1+b=0

x 1 = x 0 − λ w \mathbf{x_1} = \mathbf{x_0} - \lambda \mathbf{w} x1=x0λw 代入得到:

w ⋅ ( x 0 − λ w ) + b = 0 \mathbf{w} \cdot (\mathbf{x_0} - \lambda \mathbf{w}) + b = 0 w(x0λw)+b=0

展开并整理得到:

w ⋅ x 0 − λ ∥ w ∥ 2 + b = 0 \mathbf{w} \cdot \mathbf{x_0} - \lambda \|\mathbf{w}\|^2 + b = 0 wx0λw2+b=0

解出 λ \lambda λ

λ = w ⋅ x 0 + b ∥ w ∥ 2 \lambda = \frac{\mathbf{w} \cdot \mathbf{x_0} + b}{\|\mathbf{w}\|^2} λ=w2wx0+b

  1. 距离公式

x 0 \mathbf{x_0} x0 到投影点 x 1 \mathbf{x_1} x1 的距离即为垂直距离:

距离 = ∥ x 0 − x 1 ∥ \text{距离} = \|\mathbf{x_0} - \mathbf{x_1}\| 距离=x0x1

x 1 \mathbf{x_1} x1 代入得到:

x 0 − x 1 = x 0 − ( x 0 − λ w ) = λ w \mathbf{x_0} - \mathbf{x_1} = \mathbf{x_0} - (\mathbf{x_0} - \lambda \mathbf{w}) = \lambda \mathbf{w} x0x1=x0(x0λw)=λw

因此,距离为:

距离 = ∥ λ w ∥ = ∣ λ ∣ ∥ w ∥ \text{距离} = \|\lambda \mathbf{w}\| = |\lambda| \|\mathbf{w}\| 距离=λw=λ∣∥w

λ = w ⋅ x 0 + b ∥ w ∥ 2 \lambda = \frac{\mathbf{w} \cdot \mathbf{x_0} + b}{\|\mathbf{w}\|^2} λ=w2wx0+b代入得到:

距离 = ∣ w ⋅ x 0 + b ∥ w ∥ 2 ∣ ∥ w ∥ = ∣ w ⋅ x 0 + b ∣ ∥ w ∥ \text{距离} = \left| \frac{\mathbf{w} \cdot \mathbf{x_0} + b}{\|\mathbf{w}\|^2} \right| \|\mathbf{w}\| = \frac{|\mathbf{w} \cdot \mathbf{x_0} + b|}{\|\mathbf{w}\|} 距离= w2wx0+b w=wwx0+b

对于最优分离超平面,两类样本的支持向量(即离超平面最近的样本)满足以下条件:

对于正类支持向量: w ⋅ x + b = + 1 \mathbf{w} \cdot \mathbf{x} + b = +1 wx+b=+1

对于负类支持向量: w ⋅ x + b = − 1 \mathbf{w} \cdot \mathbf{x} + b = -1 wx+b=1

这些支持向量定义了间隔边界。分类间隔(margin)是这两个边界之间的垂直距离。

对于正类支持向量, w ⋅ x + b = 1 \mathbf{w} \cdot \mathbf{x} + b = 1 wx+b=1,所以到超平面的距离为:

距离 = 1 ∥ w ∥ \text{距离} = \frac{1}{\|\mathbf{w}\|} 距离=w1

同样,对于负类支持向量, w ⋅ x + b = − 1 \mathbf{w} \cdot \mathbf{x} + b = -1 wx+b=1,到超平面的距离也是:

距离 = 1 ∥ w ∥ \text{距离} = \frac{1}{\|\mathbf{w}\|} 距离=w1

05 约束条件表达式理解

  • w ⋅ x i + b > 0 \mathbf{w} \cdot \mathbf{x}_i + b > 0 wxi+b>0,则 x i \mathbf{x}_i xi 被分类为正类。

  • w ⋅ x i + b < 0 \mathbf{w} \cdot \mathbf{x}_i + b < 0 wxi+b<0,则 x i \mathbf{x}_i xi 被分类为负类。

  • y i = + 1 y_i = +1 yi=+1 时, y i ( w ⋅ x i + b ) = w ⋅ x i + b y_i (\mathbf{w} \cdot \mathbf{x}_i + b) = \mathbf{w} \cdot \mathbf{x}_i + b yi(wxi+b)=wxi+b,表示正类样本与超平面的距离。

  • y i = − 1 y_i = -1 yi=1 时, y i ( w ⋅ x i + b ) = − ( w ⋅ x i + b ) y_i (\mathbf{w} \cdot \mathbf{x}_i + b) = -(\mathbf{w} \cdot \mathbf{x}_i + b) yi(wxi+b)=(wxi+b),表示负类样本与超平面的距离的相反数。

  • 约束条件 y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1 y i ( w ⋅ x i + b ) ≤ − 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \leq -1 yi(wxi+b)1能够清晰地定义正类和负类样本相对于超平面的位置关系。

为什么是大于1?(个人理解)

  1. 最大化分类间隔
    SVM的目标是找到一个超平面,使得所有数据点到超平面的距离(即 ∣ w ⋅ x i + b ∣ | \mathbf{w} \cdot \mathbf{x}_i + b | wxi+b)尽可能大。约束条件 y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1 确保了正类和负类样本离超平面的距离至少为1。这样做的好处是可以确保分类间隔最大化,因为超平面距离数据点的越远,分类间隔就越大。

  2. 避免分类错误
    如果约束条件是 y i ( w ⋅ x i + b ) ≥ 0 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 0 yi(wxi+b)0,则意味着只要数据点在超平面的正确一侧,就被认为是正确分类的。这种情况下,可能会出现分类间隔较小或者出现分类错误的情况,因为数据点可以非常接近超平面而仍然被认为是正确分类的。而约束条件 y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1 确保了只有在距离超平面足够远的情况下,数据点才被认为是正确分类的,从而提高了分类的准确性和泛化能力。

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

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

相关文章

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天&#xff1a;2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽&#xff08;优点&#xff1a;松散耦合&#xff09;帮助文档的查阅方法-②找信…

【数据挖掘】机器学习中相似性度量方法-闵可夫斯基距离

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

java周测总结(2)

1.什么是I0流. 是一串流动的字符从先进先出的方式发送信息的通道。 2.IO流共有多少种划分方式,分别都包含哪些流 三种 按流分 输出输入流 按处理单元分 字节和节符 按流的角色方 节点流和处理流 3.如何把字荐串交量str转换为字节数组,并且存入bytes数组当中 byt…

达梦8 通过SF_INJECT_HINT解决新排序机制下失控语句影响其他SQL执行的问题

达梦数据库有两种排序机制。当SORT_FLAG设置0时&#xff0c;采用旧排序机制&#xff1b;当SORT_FLAG1时&#xff0c;采用新排序机制。详见《达梦新老排序机制的对比》 两种排序机制各有优缺点。 新排序机制引入了全局排序区概念&#xff0c;虽然避免了内存溢出导致系统OOM&am…

【0-1系列】从0-1快速了解搜索引擎Scope以及如何快速安装使用(下)

前言 近日&#xff0c;社区版家族正式发布V2024.5版本&#xff0c;其中&#xff0c;社区开发版系列重磅发布Scope开发版以及StellarDB开发版。 为了可以让大家更进一步了解产品&#xff0c;本系列文章从背景概念开始介绍&#xff0c;深入浅出的为读者介绍Scope的优势以及能力…

OOM日志分析

目录 1. 日志分析2. MAT 工具2.1 日志打印方式2.1.1 HeapDumpOnOutOfMemoryError&#xff08;推荐&#xff09;2.1.2 jmp 命令 2.2 MAT分析方式2.2.1 饼图分析2.2.2 树形图分析2.2.2 泄漏疑点 3. 优化 首先说一下结论&#xff1a;通过MAT工具分析才是最精准的&#xff0c;直接通…

[数据概念]梅宏院士-数据要素化怎么办十问

“ 提出问题&#xff0c;才能解决问题。” 5月27日&#xff0c;2023中国国际大数据产业博览会“数据要素流通与价值化”论坛举行&#xff0c;中国科学院院士、中国计算机学会理事长梅宏发出数据要素化十问。 本文主要内容转自 数字化转型战略指南 01 第一问&#xff1a;能否以…

基于SpringBoot+Vue大学毕业设计管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

【深度学习实战(40)】可变形卷积

一、可变形卷积&#xff08;DCN/DConv&#xff09; (a)是普通的卷积操作 (b)、©、(d)是可变形卷积&#xff08;deformable convolution&#xff0c;即DConv&#xff09; 可变形卷积实际是指标准卷积操作中采样位置增加了一个偏移量offset&#xff0c;这样卷积核就能在训…

Git 冲突处理指南:恢复 Git Reset

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

市场情绪周期2024-6-12(无用之用篇)

佛学老指引人们去向内求&#xff0c;“灵山就在汝心头&#xff0c;人人有个灵山塔&#xff0c;好在灵山塔下修”&#xff0c;你跟佛有没有缘&#xff0c;在于你是某个阶段不用别人引导自己发现那些东西已经在等你很久了&#xff0c;为何向内求&#xff1f;因为内心才是人之主体…

react使用OpenLayers实现类似船某网在地图放大时展示具体船舶符号缩小时显示聚合小点效果

一、效果 如图所示&#xff0c;地图缩小&#xff08;即比例尺放大&#xff09;时&#xff0c;显示聚合小绿点&#xff1b; 地图放大&#xff08;比例尺缩小&#xff09;时&#xff0c;展示具体船舶符号&#xff1a; 二、思路 1&#xff09;设置2个图层&#xff0c;一个展示…

【区块链】区块链架构设计:从原理到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链架构设计&#xff1a;从原理到实践引言一、区块链基础概念1.1 区块链定义…

解决:net8使用swagger的时候,调用接口401,Error: Unauthorized,无法通过验证,其实是因为没有Authorization头

目录 1. 背景2. 解决方案 1. 背景 上一篇文章讲了用net8JWTSwagger&#xff0c;尝试做一个demo&#xff0c;然后掉坑里&#xff0c;jwt能生成token&#xff0c;但是解析不正确&#xff0c;地址&#xff0c;这个demo还遇到一个奇怪的问题&#xff0c;一个demo遇到2个奇怪的问题…

Leetcode84 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积 解题思路 思路一&#xff1a;暴力寻找&#xff0c;从每个位置出发&#xff0c;向左右两边扩…

上证所抓包实战

第 2 页jsonCallBack 回调函数Request Headers爬取股票列表下载时间戳Initiator在 Network 中抓到的包,有 Headers、Payload、Preview、Response、Initiator、Timing、Cookies 面板,从这些面板中获取有用的信息来写脚本。 上海证券交易所 https://www.sse.com.cn/assortment…

数据分析必备:一步步教你如何用matplotlib做数据可视化(10)

1、Matplotlib 二维箭头图 箭头图将速度矢量显示为箭头&#xff0c;其中分量(u&#xff0c;v)位于点(x&#xff0c;y)。 quiver(x,y,u,v)上述命令将矢量绘制为在x和y中每个对应元素对中指定的坐标处的箭头。 参数 下表列出了quiver()函数的参数 - x - 1D或2D阵列&#xff0c;…

示例:推荐一个基于第三方QRCoder.Xaml封装的二维码显示控件

一、目的&#xff1a;基于第三方QRCoder.Xaml封装的二维码控件&#xff0c;为了方便WPF调用 二、效果如下 功能包括&#xff1a;背景色&#xff0c;前景色&#xff0c;中心图片设置和修改大小&#xff0c;二维码设置等 三、环境 VS2022 四、使用方式 1、安装nuget包&#xf…

国产自研编程语言“仓颉”来了!

在 6.21 召开的华为开发者大会&#xff08;HDC2024&#xff09;上,华为自研的国产编程语言“仓颉”终于对外正式发布了&#xff01; 随着万物互联以及智能时代的到来&#xff0c;软件的形态将发生巨大的变化。一方面&#xff0c;移动应用和移动互联网领域仍然强力驱动人机交互…

抖音多功能全自动引流工具,支持评论关注私信留痕点赞等,让你的抖音粉丝暴涨!

随着短视频行业的火爆&#xff0c;越来越多的人开始关注抖音这个平台。然而&#xff0c;如何在抖音上获得更多的关注和粉丝&#xff0c;成为了许多人面临的难题。为了帮助大家解决这个问题&#xff0c;今天我们将为大家推荐一款抖音多功能全自动引流脚本&#xff0c;这款脚本可…