SVM超详细原理总结

哈喽,我是我不是小upper~

今天想跟大家聊聊支持向量机(SVM)。很多初学者对这个算法模型特别感兴趣,它也是初学者在学习过程中非常喜爱的一种模型,更是机器学习领域中极为重要的算法之一!

今天想跟大家深入探讨一下支持向量机(SVM)的细节,咱们主要从以下几个方面来展开~

SVM 的基础内容

  • 线性可分 SVM

    • 在较为简单且理想的情况下,数据是线性可分的,也就是说,可以通过一个直线(在二维空间中)或平面(在三维空间中)等超平面,将不同类别的数据点完美地分隔开来。

    • 最优超平面:我们的目标是找到这样一个超平面,它能够使得最近的数据点(我们把这些数据点称作支持向量)到超平面的距离达到最大值。在二维空间里,超平面就表现为一条直线。

    • 数学表达:超平面可以用下面的方程来表示:

                                                                    w⋅x+b=0

    其中,w 是超平面的法向量,b 是偏置项。

    • 决策规则:基于超平面,我们采用符号函数来进行分类决策,具体如下:

                                                                  sign(w⋅x+b)
    • 优化问题:我们的主要目标是最大化边距,这可以转化为如下的优化问题:

  • 非线性 SVM 和核方法

    • 然而,在现实场景中,数据往往并不是线性可分的。这时,核方法就派上用场了。核方法通过一个非线性映射,将原始特征空间映射到一个更高维的空间。在新的特征空间中,数据可能就变得线性可分了。

    • 核函数:常见的核函数有多种,例如多项式核、径向基函数(RBF,也常被称为高斯核)等。

    • 核函数的作用:借助核函数,我们能够在原始空间中计算出点积,而无需将数据点显式地表示在高维空间中。这大大简化了计算过程,同时也避免了高维空间带来的计算复杂度问题。

  • 软间隔和正则化

    • 在现实世界的数据中,很少有数据是完全线性可分的。因此,我们引入了软间隔的概念,允许一些数据点可以违反边距规则。

    • 松弛变量:为了处理数据点的重叠和非可分情况,我们引入了松弛变量 ξi​。

    • 正则化参数 C:参数 C 用于控制边距的硬度以及对错误分类样本的惩罚程度,它是一个正则化参数。通过调整 C 的值,我们可以在模型的复杂度和分类准确性之间取得平衡。

  • 优化问题(软间隔)

    • 对于软间隔 SVM,优化问题转变为:


以下是对支持向量机(SVM)原理及项目实践的系统化阐述,基于技术细节展开并强化理论与代码的对应关系:

1. SVM 核心原理与数学基础

1.1 线性可分场景:硬间隔 SVM

当样本数据在特征空间中线性可分时,SVM 的目标是寻找一个最优超平面,使得不同类别数据点到超平面的几何间隔最大化

  • 超平面方程:在 n 维空间中,超平面由 \mathbf{w}^T\mathbf{x} + b = 0 表示,其中 \mathbf{w} = (w_1, w_2, \dots, w_n) 为法向量,决定超平面方向;b 为偏置项,决定超平面位置。
  • 几何间隔:样本点(\mathbf{x}_i, y_i)到超平面的距离为 \frac{| \mathbf{w}^T\mathbf{x}_i + b |}{\|\mathbf{w}\|},其中 y_i \in \{-1, +1\} 为类别标签。
  • 优化目标:最大化所有样本点的最小几何间隔,等价于求解以下凸二次规划问题:                           该问题的解由少数关键样本点(支持向量)决定,这些点位于间隔边界上(y_i(\mathbf{w}^T\mathbf{x}_i + b) = 1)。
1.2 非线性场景:核方法与特征空间映射

当数据在原始特征空间非线性可分时,SVM 通过核函数将样本映射到更高维的特征空间 \mathcal{H},使数据在 \mathcal{H} 中线性可分。

  • 核函数定义:核函数 K(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i) \cdot \phi(\mathbf{x}_j) 表示原始空间中样本在高维空间的内积,避免了显式计算高维坐标(如 \phi(\mathbf{x}) 为映射函数)。
  • 常用核函数
    • 线性核K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i \cdot \mathbf{x}_j,适用于线性可分数据。
    • 多项式核K(\mathbf{x}_i, \mathbf{x}_j) = (\mathbf{x}_i \cdot \mathbf{x}_j + c)^d,引入多项式特征。
    • 高斯核(RBF)K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma\|\mathbf{x}_i - \mathbf{x}_j\|^2),通过参数 \gamma 控制局部影响范围。
1.3 现实场景:软间隔与正则化

由于噪声和数据重叠的普遍存在,SVM 引入软间隔允许部分样本违反间隔约束,通过松弛变量 \xi_i \geq 0 量化样本的 “违规程度”。

  • 优化问题调整\min_{\mathbf{w}, b, \xi} \frac{1}{2}\|\mathbf{w}\|^2 + C \sum_{i=1}^m \xi_i \quad \text{s.t.} \quad y_i(\mathbf{w}^T\mathbf{x}_i + b) \geq 1 - \xi_i, \ \xi_i \geq 0 其中 C > 0 为正则化参数:
    • C 越大,对分类错误的惩罚越强,模型复杂度越高(过拟合风险增加);
    • C 越小,允许更多分类错误,模型更倾向于最大化间隔(泛化能力增强)。

2. SVM 决策边界可视化与代码实现

2.1 二维数据决策边界绘制

以下代码基于 sklearn 实现线性 SVM 的决策边界可视化:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs# 创建 2D 数据集
X, y = make_blobs(n_samples=40, centers=2, random_state=6)# 训练 SVM 模型
clf = svm.SVC(kernel='linear', C=1000)
clf.fit(X, y)# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)# 绘制决策边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()# 创建网格来评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)# 绘制决策边界和边距
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])# 标记支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='k')
plt.show()

关键逻辑

  • decision_function 返回样本到超平面的有符号距离,通过等高线图可视化决策边界(Z=0)和间隔边界(Z=±1)。
  • 支持向量为距离超平面最近的样本点,决定了超平面的位置。
2.2 三维超平面与软间隔可视化

对于三维数据,超平面为 \mathbf{w}^T\mathbf{x} + b = 0,软间隔允许样本点位于间隔内或错误分类侧。通过调整 C 可控制间隔 “硬度”,但二维代码难以直接扩展至三维,需借助投影或降维技术(如 PCA)间接可视化。

3. 鸢尾花数据集分类项目详解

3.1 数据预处理
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaleriris = load_iris()
# 仅保留后两类数据(类别1和2)及前两个特征(简化为二维分类问题)
X_2d = iris.data[iris.target > 0, :2]
y_2d = iris.target[iris.target > 0] - 1  # 转换为0-1标签
# 标准化:使各特征均值为0、方差为1,避免尺度差异影响模型
scaler = StandardScaler()
X_2d = scaler.fit_transform(X_2d)

技术要点

  • 标准化是 SVM 的关键步骤,因 SVM 依赖样本间的距离计算,特征尺度差异会导致模型偏向大尺度特征。
  • 二维化处理便于可视化,但实际应用中需保留更多特征以提升分类精度。
3.2 网格搜索与参数调优
from sklearn.model_selection import GridSearchCV, StratifiedShuffleSplit
from sklearn.svm import SVC# 定义参数网格:C(正则化强度)和gamma(RBF核参数)
C_range = np.logspace(-2, 10, 13)  # C从1e-2到1e10,共13个值
gamma_range = np.logspace(-9, 3, 13)  # gamma从1e-9到1e3,共13个值
param_grid = {'gamma': gamma_range, 'C': C_range}
# 分层交叉验证:保持类别分布均衡,5折拆分,20%数据用于验证
cv = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42)
grid = GridSearchCV(SVC(kernel='rbf'), param_grid, cv=cv)
grid.fit(X_2d, y_2d)

参数含义

  • C:控制模型对训练数据的拟合程度,小 C 对应更宽的间隔和更强的正则化。
  • gamma:在 RBF 核中,控制单个样本的影响范围。小 gamma 使决策边界更平滑(泛化性强),大 gamma 导致过拟合。
3.3 决策边界与性能可视化
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize# 训练不同参数组合的SVM模型
C_2d_range = [1e-2, 1, 1e2]
gamma_2d_range = [1e-1, 1, 1e1]
classifiers = [(C, gamma, SVC(C=C, gamma=gamma).fit(X_2d, y_2d)) for C in C_2d_range for gamma in gamma_2d_range]# 绘制决策边界子图
plt.figure(figsize=(8, 6))
xx, yy = np.meshgrid(np.linspace(-3, 3, 200), np.linspace(-3, 3, 200))
for k, (C, gamma, clf) in enumerate(classifiers):Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)plt.subplot(3, 3, k+1)# 绘制决策区域:-Z的色彩映射表示分类置信度plt.pcolormesh(xx, yy, -Z, cmap=plt.cm.RdBu, norm=Normalize(-1, 1))# 绘制样本点:颜色表示类别,黑色边框表示支持向量plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y_2d, cmap=plt.cm.RdBu_r, edgecolors='k')plt.title(f'gamma=10^{np.log10(gamma):.0f}, C=10^{np.log10(C):.0f}')

可视化解读

  • 决策区域:颜色越深表示分类置信度越高,白色区域为分类边界附近(低置信度)。
  • 参数影响
    • 当 C 固定时,增大 \gamma 会使决策边界更复杂(如右下角子图出现不规则边界)。
    • 当 \gamma 固定时,增大 C 会缩小间隔,允许更少分类错误(如第一列子图边界更贴近样本)。
3.4 热图分析参数组合性能
scores = grid.cv_results_['mean_test_score'].reshape(len(C_range), len(gamma_range))
plt.figure(figsize=(8, 6))
# 自定义归一化:中点设为0.92,突出高分数区域
norm = MidpointNormalize(vmin=0.2, midpoint=0.92)
plt.imshow(scores, interpolation='nearest', cmap='hot', norm=norm)
plt.xlabel('gamma (log10 scale)')
plt.ylabel('C (log10 scale)')
plt.colorbar(label='Validation Accuracy')
plt.xticks(np.arange(len(gamma_range)), gamma_range.round(2), rotation=45)
plt.yticks(np.arange(len(C_range)), C_range.round(2))

性能趋势

  • 高分数区域集中在 C 和 \gamma 中等值附近(如 C=10^0 \sim 10^4\gamma=10^{-3} \sim 10^1),表明过强或过弱的正则化均会降低泛化能力。
  • 热图可辅助选择最优参数组合,避免手动调参的盲目性。

4. SVM 关键特性总结

  1. 边际最大化:通过几何间隔最大化提升模型泛化能力,决策仅依赖支持向量,降低对噪声的敏感度。
  2. 核技巧的本质:将非线性分类问题转化为高维空间的线性问题,核心是核函数的选择与参数调优。
  3. 正则化机制:参数 C 平衡间隔宽度与分类误差,需通过交叉验证确定最优值。
  4. 数据依赖性:适用于特征维度高、样本量中等的场景(如文本分类),对大规模数据(百万级样本)需结合近似算法(如 SVMlight)。

此项目通过鸢尾花数据集的实践,系统性展示了 SVM 从理论到实现的完整流程,重点体现了参数对模型行为的定量影响,为复杂场景下的模型调优提供了可复用的方法论。

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

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

相关文章

【Oracle】触发器

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 触发器基础概述1.1 触发器的概念与特点1.2 触发器的分类1.3 触发器的执行顺序 2. DML触发器2.1 基础DML触发器2.1.1 INSERT触发器2.1.2 UPDATE触发器2.1.3 DELETE触发器 2.2 高级DML触发器2.2.1 复合触发器2…

MTK-Android12-13 Camera2 设置默认视频画质功能实现

MTK-Android12-13 Camera2 设置默认视频画质功能实现 场景:部分客户使用自己的mipi相机安装到我们主板上,最大分辨率为1280720,但是视频画质默认的是640480。实际场景中,在默认视频分辨率情况下拍出来的视频比较模糊、预览也不清晰…

QtDBus模块功能及架构解析

Qt 6.0 中的 QtDBus 模块是一个用于进程间通信(IPC)的核心模块,它基于 D-Bus 协议实现。D-Bus 是一种在 Linux 和其他类 Unix 系统上广泛使用的消息总线系统,允许应用程序和服务相互通信。 一、QtDBus模块主要功能: 1…

Spring AI 项目实战(六):Spring Boot + AI + DeepSeek 打造智能成语接龙游戏(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4Spring AI 项目实战(四…

【HarmonyOS 5】教育开发实践详解以及详细代码案例

以下是基于 ‌HarmonyOS 5‌ 的教育应用开发实践详解及核心代码案例,结合分布式能力与教育场景需求设计: 一、教育应用核心开发技术 ‌ArkTS声明式UI‌ 使用 State 管理学习进度状态,LocalStorageProp 实现跨页面数据同步(如课程…

【鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件,可以使用鸿蒙的文件系统 API】

鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件,可以使用鸿蒙的文件系统 API。 // 导入需要的模块 import fs from ohos.file.fs;const TAG"Index" Entry Component struct Index {State message: string Hello World;build() {Row() {Colum…

11. vue pinia 和react redux、jotai对比

对比 Vue 的 Pinia,和 React 的 Redux、Jotai,分中英文简要介绍、特性、底层原理、使用场景。 简单介绍 1.1 Pinia(Vue) • 英文:Pinia is the official state management library for Vue 3, designed to be simple…

OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::HOG 是 OpenCV 的 CUDA 模块中对 HOG 特征提取和目标检测 提供的 GPU 实现。它与 CPU 版本的 cv::HOGDescriptor 类似,但利…

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…

【QT】QT多语言切换

QT多语言切换 1.创建任意一个项目2. 利用lupdate(language update)工具生成.ts文件2.1 在工程中的.pro文件中指定.ts文件要存放的位置2.2 选择工具--》外部--》Qt语言家--》更新翻译 3. 利用 lrelease(Language Release)将 .ts 文…

【差分】详解二维前缀和和差分问题

文章目录 1. 二维前缀和2. 公式推导3. LeetCode 304 二维区域和检索 - 矩阵不可变3.1 304 二维区域和检索 - 矩阵不可变3.2 LeetCode 1139 最大的以 1 为边界的正方形 4. 二维差分问题5. 二维差分的原理以及差分数组计算6. 题目6.1 牛客二维差分6.2 LeetCode 2132. 用邮票贴满网…

Unity 大型手游碰撞性能优化指南

Unity 大型手游碰撞性能优化指南 版本: 2.1 作者: Unity性能优化团队 语言: 中文 前言 在Unity大型手游的开发征途中,碰撞检测如同一位隐形的舞者,它在游戏的物理世界中赋予物体交互的灵魂。然而,当这位舞者的舞步变得繁复冗余时,便会悄然消耗宝贵的计算资源,导致帧率下…

【hive】函数集锦:窗口函数、列转行、日期函数

窗口函数 https://www.cnblogs.com/Uni-Hoang/p/17411313.html <窗口函数> OVER ([PARTITION BY <分组列> [, <分组列>...]][ORDER BY <排序列> [ASC | DESC] [, <排序列> [ASC | DESC]]...][<rows or range clause>]) )窗口函数主要是…

DAY 25 异常处理

目录 DAY 25 异常处理1.异常处理机制2.debug过程中的各类报错3.try-except机制4.try-except-else-finally机制作业&#xff1a;理解今日的内容即可&#xff0c;可以检查自己过去借助ai写的代码是否带有try-except机制&#xff0c;以后可以尝试采用这类写法增加代码健壮性。 DAY…

几何绘图与三角函数计算应用

几何绘图与三角函数计算应用 设计思路 左侧为绘图控制面板&#xff0c;右侧为绘图区域支持绘制点、线、矩形、圆、多边形等基本几何图形实现三角函数计算器&#xff08;正弦、余弦、正切等&#xff09;包含角度/弧度切换和常用数学常数历史记录功能保存用户绘图 完整实现代码…

CSS 定位:原理 + 场景 + 示例全解析

一. 什么是CSS定位? CSS中的position属性用于设置元素的定位方式,它决定了元素在页面中的"定位行为" 为什么需要定位? 常规布局(如 display: block)适用于主结构 定位适用于浮动按钮,弹出层,粘性标题等场景帮助我们精确控制元素在页面中的位置 二. 定位类型全…

GESP 二级复习参考 A

本教程完整包含&#xff1a; 5000字详细知识点解析 36个Python/C双语言示例 15个GESP真题及模拟题 8张专业图表和流程图 # C编程二级标准终极教程## 一、计算机存储系统深度解析### 1.1 存储体系架构 mermaid graph TDA[CPU寄存器] --> B[L1缓存 1-2ns]B --> C[L2缓…

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…

【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面

文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…

【设计模式】1.简单工厂、工厂、抽象工厂模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 以下是 简单工厂模式、工厂方法模式 和 抽象工厂模式 的 Python 实现与对比&#xff0c;结合代码示例和实际应用场景说明&#xff1a; 1. 简单工厂模式&a…