HelloAI
L2 第 8 篇 🐣 难度 🕒 11 分钟

SVM 支持向量机:经典 ML 里的几何派

深度学习火之前,SVM 统治了 2000-2010 整整一个时代。今天它仍然是小数据集和文本分类的最优选之一。

阿莱
2026/7/9

L2-03 学的逻辑回归找的是”最佳分界线”——但什么叫”最佳”?

SVM 给了一个更几何的回答:找一条让”间距最大”的分界线——它对异常值更鲁棒,对小数据集特别有效。

第一站:最大间距

假设我们有这样的二分类数据:

○○○      ●●●
○○ │   │  ●●
○○ │   │  ●
       ↑     ↑
       这两条都能分开数据,哪条更好?

SVM 的答案让两侧到分界线的最小距离最大——这个距离叫”间距”(margin)。

直觉很合理:间距大 = 模型对新数据更鲁棒。如果分界线擦着边走,新样本稍微偏一点就分错。

第二站:支持向量

SVM 的名字来源——

支持向量(Support Vector)= 离分界线最近的那几个点。

○○○      ●●●
○○  ←这个←    ●●

                    支持向量

       支持向量

关键洞察:决定分界线的只有这几个支持向量。其它点离得远,对分界线没贡献。

所以 SVM 对”远处样本变化”完全不敏感——增删大量远处点都不影响模型。这是它的核心优势。

第三站:数学公式

线性 SVM 的优化目标:

minw,b12w2subject toyi(wxi+b)1\min_{w, b} \frac{1}{2} \|w\|^2 \quad \text{subject to} \quad y_i (w \cdot x_i + b) \ge 1

听起来吓人,翻译

  • 找一个 w,bw, b 让分界线 wx+b=0w \cdot x + b = 0
  • 让所有正样本都满足 wxi+b1w \cdot x_i + b \ge 1
  • 让所有负样本都满足 wxi+b1w \cdot x_i + b \le -1
  • 同时 w\|w\| 越小越好(这等价于”间距越大越好”)

数学性质很美——这是个凸优化问题,有全局唯一最优解

第四站:软间距(容错版)

现实数据很少是完美可分的——总有几个噪声点跨越边界。

软间距 SVM 允许少数点违反约束,但要付出代价:

minw,b,ξ12w2+Ciξi\min_{w, b, \xi} \frac{1}{2} \|w\|^2 + C \sum_i \xi_i
  • ξi\xi_i:第 ii 个样本”违反约束的程度”
  • CC:超参数,控制”对违反的容忍度”

CC 大 → 几乎不容忍违反 → 边界紧贴数据(容易过拟合) CC 小 → 容忍违反 → 边界宽松(容易欠拟合)

CC 是 SVM 最重要的调参——通常用网格搜索 + 交叉验证。

第五站:核技巧(Kernel Trick)

SVM 最强大的特性。

问题:很多数据线性不可分——比如同心圆。

○○○○○
○●●●●●○
○●○○○●○
○●○●○●○      不可能用一条直线分开
○●○○○●○
○●●●●●○
○○○○○

SVM 的招数把数据映射到更高维空间——在高维空间,原本非线性的问题可能变线性可分。

比如把 2D 同心圆映射到 3D,让中心点”抬起来”,就能用一个平面切开。

但直接计算高维特征会爆炸——10 维输入升到 1000 维特征,计算量太大。

核技巧的魔法不需要真正算高维特征,只算高维空间里的”内积”

常用核函数

公式适用
Linear(线性核)K(x,y)=xyK(x, y) = x \cdot y数据本来线性可分
Polynomial(多项式)K(x,y)=(xy+c)dK(x, y) = (x \cdot y + c)^d中等复杂度
RBF(高斯核)K(x,y)=eγxy2K(x, y) = e^{-\gamma\|x - y\|^2}万能选择,处理任意非线性
SigmoidK(x,y)=tanh(αxy+c)K(x, y) = \tanh(\alpha x \cdot y + c)类似神经网络

RBF 是 SVM 的默认选择——sklearn 里 kernel='rbf'。它能拟合任何形状的边界(够灵活就行)。

第六站:用 sklearn

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# SVM 对量纲敏感,必须标准化!
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# RBF 核 SVM
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
svm.fit(X_train, y_train)
print(f"准确率: {svm.score(X_test, y_test):.3f}")  # 通常 97%+

SVM 在小数据集(<10 万)上经常超过随机森林

重要超参数

参数作用调参方向
C容忍违反的程度0.1 ~ 100(log 刻度)
gammaRBF 核的”局部性“‘scale’ 默认就好
kernel核函数RBF 默认,文本用 linear

第七站:SVM 的优劣

优点

  • 小数据上效果好——只看支持向量,需要的数据不多
  • 高维表现优秀——文本分类(几万维 TF-IDF 特征)SVM 仍是经典
  • 理论优雅——凸优化、全局最优、有坚实数学保证
  • 对异常值不敏感——远处异常点不影响

缺点

  • 大数据慢——百万样本以上训练困难(计算复杂度 O(n²-n³))
  • 调参敏感——尤其是 RBF 的 gamma 和 C
  • 不输出概率——sklearn 用 probability=True 能给概率但慢且不准
  • 多分类不优雅——用 OvR 或 OvO 凑出来
  • 可解释性差——不像决策树那样能”看见决策路径”

第八站:SVM 今天的角色

仍然用得多的场景

  1. 小数据集分类(<1 万样本):随机森林 / XGBoost 可能过拟合,SVM 稳
  2. 文本分类(垃圾邮件、情感分析):高维 TF-IDF 特征 + linear SVM 至今是 baseline
  3. 图像识别(小数据集):SVM + HOG 特征仍是某些场景的最优选
  4. 生物信息:基因序列、蛋白质分类
  5. 金融风控:和 GBDT 一起作为模型 ensemble 的成员

被取代的场景

  • 大规模数据:神经网络 / GBDT 完胜
  • 图像识别(大数据):CNN 完胜
  • NLP(深度任务):Transformer 完胜

一个反常识

很多人觉得”SVM 是上世纪的算法,现在没人用了”——完全错

Kaggle 上的文本分类比赛、医疗诊断小数据集比赛、bioinformatics 比赛——SVM 至今活跃

工业界里 sklearn 用的最多的算法之一仍然是 SVC。

一个工程铁律:数据 < 10 万 + 特征工程做得好——SVM 经常比深度学习更好

💡 L2 的 8 个算法对比

你已经学完 L2 的主要算法。一张选择表:

数据推荐
线性可分逻辑回归
表格数据 + 大量样本XGBoost / LightGBM
小数据 + 高维SVM
需要可解释决策树
任何问题的 baseline随机森林
无标签K-Means

永远先用简单算法——只在简单算法不够时升级。

下一篇:L2-09 优化器深度解析(已写) 或 直接进 L3 深度学习核心

📬

读到这里说明你认真在学 🎯

订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。