Featured image of post 支持向量机(Support Vector Machine)

支持向量机(Support Vector Machine)

支持向量机学习笔记

📘 支持向量机 (SVM)

核心一句话:SVM 不仅仅是在两类数据之间画一条线,而是试图寻找一条最宽的街道(最大间隔),使得两类数据不仅分开,而且分得“最安全”。

直观理解:什么是 SVM?

想象你在桌子上放了两堆小球:🔴 红球 和 🔵 蓝球

任务

你需要拿一根木棍放在桌子上,把红球和蓝球分开。

不同的解法

  • 解法 A:木棍紧贴着红球放。风险:如果再放一个新的红球稍微滚远一点,就越界了。

  • 解法 B:木棍紧贴着蓝球放。风险:同上,对蓝球不安全。

  • SVM 解法:把木棍放在红球和蓝球的正中间,并且尽可能保证木棍离最近的红球和最近的蓝球距离相等且最大

关键术语

  • 超平面 (Hyperplane):就是那根木棍(在二维是线,三维是面,高维叫超平面)。

  • 支持向量 (Support Vectors):离木棍最近的那几个球。

    • 注: 只有这几个球决定了木棍的位置,其他的球哪怕拿走,木棍位置也不变。这就是“支持向量机”名字的由来。
  • 间隔 (Margin):木棍两边留出的安全距离(也就是“街道”的宽度)。


几何视角:间隔与超平面

在数学上,我们如何描述这个“木棍”和“距离”?

假设我们的数据样本集为 (x_i, y_i),其中 x_i 是特征向量,y_i 属于 {+1, -1} 是标签。

超平面方程

n 维空间中,超平面可以表示为:

w^T * x + b = 0

  • w:法向量 (Normal Vector),决定了超平面的方向(垂直于超平面)。

  • b:偏置 (Bias),决定了超平面与原点的距离。

分类决策函数

如果我们有一个新样本 x,代入方程:

f(x) = sign( w^T * x + b )

  • 如果结果 > 0,预测为正类 (+1)。

  • 如果结果 < 0,预测为负类 (-1)。

点到平面的距离

样本空间中任意一点 x 到超平面 (w, b) 的几何距离公式为:

d = |w^T * x + b| / ||w||

其中 ||w||w 的欧几里得范数(也就是向量长度)。


数学建模:硬间隔 (Hard Margin)

前提:假设数据是完全线性可分的(可以完美分开)。

我们的目标

我们想要找到一个超平面 (w, b),使得:

  1. 所有点都被正确分类。

  2. 间隔 (Margin) 最大化

函数间隔 vs 几何间隔

为了方便计算,我们规定:离超平面最近的那些点(支持向量),它们满足 |w^T * x + b| = 1(为什么是1?因为 w 和 b 可以同比例缩放而不改变超平面位置,我们通过缩放把函数间隔固定为 1,这是数学上的 Trick)

那么,对于所有的样本 i,必须满足约束条件:

  • 正样本:w^T * x_i + b >= 1

  • 负样本:w^T * x_i + b <= -1

统一写成一个公式:

y_i * (w^T * x_i + b) >= 1 (对于所有 i = 1…N)

最大化间隔

此时,支持向量到超平面的距离就是 1 / ||w||, 整个“街道”的宽度(Margin)就是 2 / ||w||

优化目标: 我们要最大化 2 / ||w||,等价于最小化 ||w||,等价于最小化 0.5 * ||w||^2(为了求导方便,加了平方和系数)。

最终的优化问题 (Primal Problem)

这是一个凸二次规划问题 (Convex Quadratic Programming):

最小化 (Min)0.5 * ||w||^2 约束条件 (s.t.)y_i * (w^T * x_i + b) >= 1 (对于所有 i)


数学推导:拉格朗日对偶性 (The Math Magic)

初学者提示:这部分最难。如果你只关心应用,可以跳过看结论。但理解它能让你明白 SVM 为什么能用核函数。

为了求解上述带有不等式约束的优化问题,我们需要使用 拉格朗日乘子法 (Lagrange Multipliers)

构造拉格朗日函数

引入拉格朗日乘子 α_i >= 0 (Alpha),将约束条件融合到目标函数中:

L(w, b, α) = [ 0.5 * ||w||^2 ] - Sum( α_i * [y_i * (w^T * x_i + b) - 1] )

(注:Sum 代表求和符号)

原问题转化为对偶问题 (Dual Problem)

原问题是 min(w,b) max(α) L。 根据对偶性,我们将其转化为 max(α) min(w,b) L意义:我们要先求 Lwb 的极小值,再求对 α 的极大值。

求偏导数并令其为 0

wb 求偏导:

  1. dL / dw = w - Sum( α_i * y_i * x_i ) = 0 => w = Sum( α_i * y_i * x_i ) (关键公式 1)

  2. dL / db = -Sum( α_i * y_i ) = 0 => Sum( α_i * y_i ) = 0 (关键公式 2)

代回拉格朗日函数

将上述两个关键公式代回 L(w, b, α),消去 wb。 经过一番化简,我们得到了对偶问题

最大化 (Max): Sum(α_i) - 0.5 * Sum( Sum( α_i * α_j * y_i * y_j * (x_i^T * x_j) ) )

约束条件 (s.t.):

  1. Sum( α_i * y_i ) = 0

  2. α_i >= 0

观察这个完美的公式

请注意上面的对偶形式,数据样本 x 仅仅以 内积 (x_i^T * x_j) 的形式出现! 这意味着:我们不需要知道 x 的具体坐标,只要知道两个向量的内积即可。这为核函数埋下了伏笔。

  • 求解出最优的 α* 后,我们就可以得到 w* = Sum( α_i* * y_i * x_i )

  • 根据 KKT 条件,只有支持向量的 α_i > 0,非支持向量的 α_i = 0


软间隔 (Soft Margin):容忍噪声

现实问题:数据通常不是完美的,可能混杂了一些噪声点(比如红球堆里混进了一个蓝球)。如果强制用硬间隔,SVM 可能会失效或过拟合。

引入松弛变量

我们允许数据点稍微偏离超平面一点点。引入松弛变量 ξ_i >= 0 (Xi)。 约束条件变为:

y_i * (w^T * x_i + b) >= 1 - ξ_i

新的目标函数

我们既要最大化间隔(最小化 ||w||^2),又要让违反规则的程度(Sum(ξ_i))尽可能小。

min [ 0.5 * ||w||^2 + C * Sum(ξ_i) ]

参数 C 的含义

C 是惩罚系数(超参数),你需要手动设置。

  • C 很大:对错误的容忍度极低 -> 类似于硬间隔 -> 容易过拟合

  • C 很小:允许更多错误 -> 追求更宽的间隔 -> 容易欠拟合(但也可能泛化更好)。


核函数 (Kernel Trick):升维打击

终极问题:如果数据根本就是非线性的(比如“太极图”或“同心圆”),无论怎么画直线都分不开,怎么办?

思想:升维

Cover 定理:在低维空间线性不可分的数据,映射到高维空间后,往往是线性可分的。

  • 比喻:桌子上的红豆绿豆混在一起(2D),你猛拍桌子,豆子腾空而起(3D),你在空中插入一张纸,就把它们分开了。

核函数的定义

我们定义一个映射 φ(x) (Phi) 将 x 映射到高维。 在对偶问题中,我们需要计算 φ(x_i)^T * φ(x_j)。 如果直接计算 φ(x) 维数太高,计算量会爆炸。

核函数 (Kernel Function) K(x_i, x_j) 的作用是: 它能够直接在低维空间算出高维空间的内积,而不需要显式地算出高维坐标。

K(x_i, x_j) = φ(x_i)^T * φ(x_j)

常用核函数

  1. 线性核 (Linear Kernel): K(x, z) = x^T * z

    • 就是不升维,相当于标准 SVM。适用于特征很多(文本分类)的情况。
  2. 多项式核 (Polynomial Kernel): K(x, z) = (x^T * z + 1)^d

    • 映射到多项式空间。参数多,较少用。
  3. 高斯核 / 径向基函数 (RBF Kernel): K(x, z) = exp( -γ * ||x - z||^2 )

    • 最常用!万能核! 它将数据映射到无穷维空间。

    • γ (Gamma) 是控制分布宽度的参数。


总结与实战建议

知识图谱回顾

  1. SVM 目的:找最大间隔的超平面。

  2. 支持向量:决定边界的关键少数点。

  3. 对偶问题:将优化转化为计算内积,简化求解。

  4. 核函数:解决非线性问题(升维打击)。

什么时候用 SVM?

  • 适用

    • 中小规模数据集(几千到几万样本)。

    • 特征维度很高(甚至比样本数还多)。

    • 非线性分类问题。

  • 不适用

    • 超大规模数据集(训练太慢)。

    • 数据噪声极大,或缺失值很多。

调参指南 (Scikit-Learn)

在使用 sklearn.svm.SVC 时,主要调两个参:

  1. C (Cost):

    • 调大 -> 变严 -> 易过拟合。

    • 调小 -> 变宽 -> 易欠拟合。

  2. gamma (仅限 RBF 核):

    • 调大 -> 高斯分布很尖 -> 只关注眼前的数据 -> 易过拟合。

    • 调小 -> 高斯分布很平 -> 视野很宽 -> 决策边界平滑。

This blog has been running for
Published 11 posts · Total 48.46k words