第 13 步 · 找最大间隔的分界线
SVM 支持向量机Support Vector Machine
找"最大间隔"的分类线 — 离分界线最近的点决定了模型
10 分钟
阅读 + 实操
1 个
交互演示
中级
难度
SVM · 交互演示
支持向量--
训练准确率--
为什么学这步?
分类问题里能分开两类的直线有无数条,哪条最好?SVM 的答案是:找最大间隔的那条 — 离两边数据都最远,对噪声最鲁棒。它在小样本、高维数据上表现优异,核技巧能把线性不可分的数据隐式映射到高维空间变可分。理解 SVM 也帮你建立"间隔"和"支持向量"这两个贯穿 ML 的关键直觉。
📌 发生了什么
- 在所有能分开两类的直线中,找离两边数据最远的那条。
- 落在间隔边界上的点就是支持向量,它们决定了模型。
- 核技巧用核函数隐式把数据映射到高维,解决线性不可分问题。
⚠️ 常见陷阱
- SVM 一定比其他模型准?不一定,大数据集上训练会变慢。
- 调 C 比选核更重要?经常反过来,先选对核再调 C。
- 不做特征缩放也行?不行,SVM 基于距离计算,必须先标准化。
✅ 本章小结
- 最大间隔:找离两边数据最远的分界线。
- 支持向量:落在间隔边界上的点决定了模型。
- 核技巧:隐式映射到高维解决线性不可分。
📐 最大间隔与对偶问题
SVM 在所有能分开两类的直线中,找间隔(margin)最大的那条,让模型对噪声最鲁棒。
最大化间隔等价于最小化 ‖w‖,约束为所有点正确分类且在间隔边界之外:
引入拉格朗日乘子 α_i,得到对偶问题。只有支持向量 α_i > 0:
核技巧:用核函数 K(x_i, x_j) 替代内积,隐式映射到高维空间,无需显式计算 φ(x):
🎛 正则参数 C 对比
C 控制对误分类的容忍度。C 大 = 硬间隔(不容忍),C 小 = 软间隔(允许一些误分类)。
| 参数 C | 表现 | 结果 |
|---|---|---|
| C = 0.1 | 软间隔,容忍较多误分类 | 欠拟合 |
| C = 1 | 间隔与误分类平衡 | 推荐 |
| C = 10 | 接近硬间隔,间隔窄 | 易过拟合 |
| C = 1000 | 几乎不容忍,严重过拟合 | 不推荐 |
💡 核函数选择优先于 C:线性可分用 Linear,非线性用 RBF,文本用 Linear 或 Sigmoid。
💻 核函数与 SVM 预测
常用核函数实现与基于支持向量的预测(Python):
import numpy as np
# 线性核
def linear_kernel(x1, x2):
return np.dot(x1, x2)
# RBF 核(高斯核)
def rbf_kernel(x1, x2, gamma=0.5):
s = 0.0
for i in range(len(x1)):
s += (x1[i] - x2[i]) ** 2
return np.exp(-gamma * s)
# 多项式核
def poly_kernel(x1, x2, degree=3):
return (np.dot(x1, x2) + 1) ** degree
# SVM 预测:只有支持向量参与计算
def svm_predict(x, alphas, sv_x, sv_y, b, kernel):
s = b
for i in range(len(sv_x)):
if alphas[i] > 0: # 支持向量
s += alphas[i] * sv_y[i] * kernel(x, sv_x[i])
return 1 if s >= 0 else -1
📚 参考文献与延伸阅读
- Cortes, C. & Vapnik, V. (1995). Support-Vector Networks. Machine Learning — SVM 的奠基论文
- Vapnik, V. (1998). Statistical Learning Theory. Wiley — 统计学习理论完整框架
- scikit-learn: SVM — 各种核函数的工业实现
- Wikipedia: Support vector machine — 最大间隔与核技巧的数学推导
📝 课后练习
检验你的理解——答对为止