Skip to content

支持向量机 ​

这个是真的难,反正我没看懂


导论:从“能分开”到“分得最稳” ​

感知机(Perceptron)只要找到一条能分开数据的超平面就停下,但这样的超平面有无穷多条。
SVM 的哲学是:不仅要分开,还要让两类之间的“路”尽可能宽。
这条“路”的宽度叫 间隔(Margin)。落在路边界上的样本叫 支持向量(Support Vectors)——它们唯一决定了这条路的走向。

一句话概括 SVM:
在特征空间中寻找一个最大间隔超平面,使得最近的不同类样本到它的距离最大化。


第一部分:硬间隔 SVM —— 理想世界的最大间隔 ​

1.1 几何直观 ​

设超平面为:

wTx+b=0

样本 xi 到超平面的有符号距离为:

wTxi+b∥w∥

对于二分类 yi∈{−1,+1},要求正确分类且位于间隔外:

yi(wTxi+b)≥1

此时最近点到超平面的距离为:

1∥w∥

因此间隔宽度为:

2∥w∥

最大化间隔等价于最小化 ∥w∥。

1.2 严格定义(硬间隔原问题) ​

minw,b12∥w∥2s.t. yi(wTxi+b)≥1,i=1,…,N

这是一个 凸二次规划(QP) 问题,有唯一全局最优解。

1.3 支持向量 ​

满足 yi(wTxi+b)=1 的样本就是支持向量。
只有它们对应的拉格朗日乘子 αi>0,其余样本 αi=0。
SVM 的解只依赖支持向量,与其余样本无关——这是它抗过拟合、适合小样本的核心原因。


第二部分:软间隔 SVM —— 现实世界的妥协 ​

现实数据往往线性不可分,或存在噪声。硬间隔会过拟合,甚至无解。
引入 松弛变量(Slack Variables) ξi≥0,允许少量样本越界:

minw,b,ξ12∥w∥2+C∑i=1Nξis.t. yi(wTxi+b)≥1−ξi,ξi≥0
  • C>0 是惩罚系数:
    • C 大 → 更不容忍错分,间隔窄,易过拟合。
    • C 小 → 更容忍错分,间隔宽,偏欠拟合。

2.1 合页损失(Hinge Loss)视角 ​

软间隔 SVM 等价于:

minw,b12∥w∥2+C∑i=1Nmax(0,1−yi(wTxi+b))

合页损失只惩罚“分类不够自信”的样本。
与逻辑回归的交叉熵损失相比,合页损失在 yif(xi)>1 后梯度为零,因此解更稀疏——只有支持向量影响模型。


第三部分:对偶问题与核技巧 —— SVM 的灵魂 ​

3.1 拉格朗日对偶 ​

引入乘子 αi≥0,构造拉格朗日函数并求极小,得到对偶问题:

maxα∑i=1Nαi−12∑i=1N∑j=1NαiαjyiyjxiTxjs.t. 0≤αi≤C,∑i=1Nαiyi=0

最终判别函数:

f(x)=sign(∑i=1NαiyixiTx+b)

关键观察:对偶形式中只出现样本间的内积 xiTxj。

3.2 KKT 条件与支持向量 ​

  • αi=0:样本被正确分类且在间隔外,非支持向量。
  • 0<αi<C:样本在间隔边界上,是支持向量。
  • αi=C:样本在间隔内或被错分,也是支持向量。

3.3 核技巧(Kernel Trick) ​

将内积替换为核函数:

K(xi,xj)=ϕ(xi)Tϕ(xj)

无需显式计算高维映射 ϕ(x),直接计算核函数即可。
常见核函数:

核函数表达式特点
线性核xiTxj高维稀疏数据,文本分类
多项式核(xiTxj+c)d捕捉特征交互
RBF / 高斯核exp⁡(−γ|xi−xj|2)最常用,无限维映射
Sigmoid 核tanh⁡(γxiTxj+r)类似神经网络

Mercer 定理:核矩阵半正定是核函数合法的充要条件。


第四部分:SMO 与工程实践 ​

4.1 SMO 算法思想 ​

对偶问题有 N 个变量,直接求解代价高。
SMO(Sequential Minimal Optimization) 每次只选两个变量 αi,αj 优化,其余固定。
因为约束 ∑αiyi=0,两个变量可解析求解。
重复直到收敛。这是 libsvm / sklearn 的底层算法。

4.2 sklearn 工程模板 ​

python
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# 关键:SVM 对特征尺度极其敏感,必须先标准化
pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='balanced'))

param_grid = {
    'svc__C': [0.1, 1, 10, 100],
    'svc__gamma': ['scale', 0.01, 0.1, 1]
}

grid = GridSearchCV(pipe, param_grid, cv=5, scoring='f1_macro')
grid.fit(X_train, y_train)

4.3 调参法则 ​

  • 必须标准化:SVM 基于欧氏距离,量纲不同会毁掉间隔。
  • RBF 核:先调 C 和 γ。
    • C 越大,模型越复杂。
    • γ 越大,每个样本影响范围越小,越容易过拟合。
  • 类别不平衡:设置 class_weight='balanced',或手动指定字典。
  • 概率输出:SVC 默认不输出概率,需 probability=True,但会内部做 Platt 校准,训练变慢。
  • 大数据:核 SVM 训练复杂度 O(N2) 到 O(N3),超过几万样本建议用 LinearSVC 或转向树模型/神经网络。

第五部分:多分类与回归 ​

5.1 多分类 ​

SVM 原生是二分类。常用策略:

  • OvO(One-vs-One):每两类训练一个分类器,投票决定。libsvm 默认,适合类别多但样本少。
  • OvR(One-vs-Rest):每类对剩余类训练一个分类器,取最大决策值。
  • DAG-SVM:有向无环图,减少测试时间。

5.2 SVR(支持向量回归) ​

将间隔思想搬到回归:允许预测值落在 f(x)±ϵ 的“管道”内,不计损失。
优化:

min12∥w∥2+C∑i=1N(ξi+ξi∗)s.t. yi−f(xi)≤ϵ+ξi,f(xi)−yi≤ϵ+ξi∗

只有管道外的样本才是支持向量。SVR 对异常值鲁棒,但同样对核与参数敏感。


第六部分:宏观对比与选型法则 ​

维度SVM逻辑回归树模型(XGBoost/LGBM)神经网络
数据规模小样本(< 10 万)中小规模中大规格大规模
特征维度高维稀疏表现好高维表现好中高维高维需嵌入
非线性核技巧需手动构造天然非线性天然非线性
可解释性支持向量可解释系数可解释特征重要性黑箱
类别不平衡class_weight + 调阈值权重 + 阈值scale_pos_weight损失加权
训练速度慢(核)快快慢
概率输出需校准天然概率天然概率天然概率

选型决策树(工程口诀):

  1. 样本量小、维度高、线性不可分 → RBF-SVM。
  2. 样本量大、追求速度与精度 → LightGBM / XGBoost。
  3. 需要概率输出与在线学习 → 逻辑回归 / SGD。
  4. 图像、语音、文本大模型 → 深度学习。
  5. 类别不平衡且漏报代价高 → SVM + class_weight='balanced' + 阈值向召回倾斜(F2)。

结语:SVM 的遗产 ​

SVM 是统计学习理论的巅峰之作:

  • 最大间隔 给出了泛化误差上界;
  • 对偶与核技巧 让线性模型拥有非线性表达能力;
  • 支持向量 揭示了“少即是多”的稀疏智慧。

尽管在超大规模数据上已被深度学习与集成树取代,但 SVM 的思想——间隔、对偶、核、稀疏性——仍然渗透在现代机器学习的血脉中。理解 SVM,就是理解“如何在有限样本下寻找最稳的决策边界”。

一句话记住 SVM:
用核函数把数据映射到高维,在那里找一条最宽的路;路上站着的,就是支持向量。