SVM 支持向量机:经典 ML 里的几何派
深度学习火之前,SVM 统治了 2000-2010 整整一个时代。今天它仍然是小数据集和文本分类的最优选之一。
L2-03 学的逻辑回归找的是”最佳分界线”——但什么叫”最佳”?
SVM 给了一个更几何的回答:找一条让”间距最大”的分界线——它对异常值更鲁棒,对小数据集特别有效。
第一站:最大间距
假设我们有这样的二分类数据:
○○○ ●●●
○○ │ │ ●●
○○ │ │ ●
↑ ↑
这两条都能分开数据,哪条更好?
SVM 的答案:让两侧到分界线的最小距离最大——这个距离叫”间距”(margin)。
直觉很合理:间距大 = 模型对新数据更鲁棒。如果分界线擦着边走,新样本稍微偏一点就分错。
第二站:支持向量
SVM 的名字来源——
支持向量(Support Vector)= 离分界线最近的那几个点。
○○○ ●●●
○○ ←这个← ●●
↑
支持向量
↑
支持向量
关键洞察:决定分界线的只有这几个支持向量。其它点离得远,对分界线没贡献。
所以 SVM 对”远处样本变化”完全不敏感——增删大量远处点都不影响模型。这是它的核心优势。
第三站:数学公式
线性 SVM 的优化目标:
听起来吓人,翻译:
- 找一个 让分界线
- 让所有正样本都满足
- 让所有负样本都满足
- 同时 越小越好(这等价于”间距越大越好”)
数学性质很美——这是个凸优化问题,有全局唯一最优解。
第四站:软间距(容错版)
现实数据很少是完美可分的——总有几个噪声点跨越边界。
软间距 SVM 允许少数点违反约束,但要付出代价:
- :第 个样本”违反约束的程度”
- :超参数,控制”对违反的容忍度”
大 → 几乎不容忍违反 → 边界紧贴数据(容易过拟合) 小 → 容忍违反 → 边界宽松(容易欠拟合)
是 SVM 最重要的调参——通常用网格搜索 + 交叉验证。
第五站:核技巧(Kernel Trick)
SVM 最强大的特性。
问题:很多数据线性不可分——比如同心圆。
○○○○○
○●●●●●○
○●○○○●○
○●○●○●○ 不可能用一条直线分开
○●○○○●○
○●●●●●○
○○○○○
SVM 的招数:把数据映射到更高维空间——在高维空间,原本非线性的问题可能变线性可分。
比如把 2D 同心圆映射到 3D,让中心点”抬起来”,就能用一个平面切开。
但直接计算高维特征会爆炸——10 维输入升到 1000 维特征,计算量太大。
核技巧的魔法:不需要真正算高维特征,只算高维空间里的”内积”。
常用核函数
| 核 | 公式 | 适用 |
|---|---|---|
| Linear(线性核) | 数据本来线性可分 | |
| Polynomial(多项式) | 中等复杂度 | |
| RBF(高斯核) | 万能选择,处理任意非线性 | |
| Sigmoid | 类似神经网络 |
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 刻度) |
gamma | RBF 核的”局部性“ | ‘scale’ 默认就好 |
kernel | 核函数 | RBF 默认,文本用 linear |
第七站:SVM 的优劣
✅ 优点:
- 小数据上效果好——只看支持向量,需要的数据不多
- 高维表现优秀——文本分类(几万维 TF-IDF 特征)SVM 仍是经典
- 理论优雅——凸优化、全局最优、有坚实数学保证
- 对异常值不敏感——远处异常点不影响
❌ 缺点:
- 大数据慢——百万样本以上训练困难(计算复杂度 O(n²-n³))
- 调参敏感——尤其是 RBF 的 gamma 和 C
- 不输出概率——sklearn 用
probability=True能给概率但慢且不准 - 多分类不优雅——用 OvR 或 OvO 凑出来
- 可解释性差——不像决策树那样能”看见决策路径”
第八站:SVM 今天的角色
仍然用得多的场景
- 小数据集分类(<1 万样本):随机森林 / XGBoost 可能过拟合,SVM 稳
- 文本分类(垃圾邮件、情感分析):高维 TF-IDF 特征 + linear SVM 至今是 baseline
- 图像识别(小数据集):SVM + HOG 特征仍是某些场景的最优选
- 生物信息:基因序列、蛋白质分类
- 金融风控:和 GBDT 一起作为模型 ensemble 的成员
被取代的场景
- 大规模数据:神经网络 / GBDT 完胜
- 图像识别(大数据):CNN 完胜
- NLP(深度任务):Transformer 完胜
一个反常识
很多人觉得”SVM 是上世纪的算法,现在没人用了”——完全错。
Kaggle 上的文本分类比赛、医疗诊断小数据集比赛、bioinformatics 比赛——SVM 至今活跃。
工业界里 sklearn 用的最多的算法之一仍然是 SVC。
一个工程铁律:数据 < 10 万 + 特征工程做得好——SVM 经常比深度学习更好。
你已经学完 L2 的主要算法。一张选择表:
| 数据 | 推荐 |
|---|---|
| 线性可分 | 逻辑回归 |
| 表格数据 + 大量样本 | XGBoost / LightGBM |
| 小数据 + 高维 | SVM |
| 需要可解释 | 决策树 |
| 任何问题的 baseline | 随机森林 |
| 无标签 | K-Means |
永远先用简单算法——只在简单算法不够时升级。
下一篇:L2-09 优化器深度解析(已写) 或 直接进 L3 深度学习核心。
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。