一、SVM 原理
1.1 最大间隔
支持向量机(Support Vector Machine, SVM)是一类基于几何间隔最大化的判别分类器。它在 1990 年代由 Vapnik 等人系统化,是核方法的代表。
二分类设定
数据 (xi,yi)(\mathbf{x}_i, y_i)(xi,yi),yi∈{−1,+1}y_i \in \{-1, +1\}yi∈{−1,+1}。超平面 w⊤x+b=0\mathbf{w}^\top \mathbf{x} + b = 0w⊤x+b=0 把两类分开。预测:
y^=sign(w⊤x+b)\hat{y} = \text{sign}(\mathbf{w}^\top \mathbf{x} + b)y^=sign(w⊤x+b)
点到超平面的距离(函数间隔与几何间隔)
- 函数间隔 :γ^i=yi(w⊤xi+b)\hat{\gamma}_i = y_i (\mathbf{w}^\top \mathbf{x}_i + b)γ^i=yi(w⊤xi+b)。仅当 w,b\mathbf{w}, bw,b 等比例缩放时可任意放大------不是"距离"的几何度量。
- 几何间隔 :γi=yi⋅w⊤xi+b∣w∣2\gamma_i = y_i \cdot \frac{\mathbf{w}^\top \mathbf{x}_i + b}{|\mathbf{w}|_2}γi=yi⋅∣w∣2w⊤xi+b。∣w∣|\mathbf{w}|∣w∣ 归一化后即真实距离。
最大间隔思想
选使最小几何间隔(最差点到超平面的距离)最大化的超平面:
maxw,bminiγi=maxw,bminiyiw⊤xi+b∣w∣2\max_{\mathbf{w}, b} \quad \min_i \gamma_i = \max_{\mathbf{w}, b} \min_i y_i \frac{\mathbf{w}^\top \mathbf{x}_i + b}{|\mathbf{w}|_2}w,bmaximinγi=w,bmaximinyi∣w∣2w⊤xi+b
固定 ∣w∣|\mathbf{w}|∣w∣ 为 1 后等价表述:
maxw,bγs.t.yi(w⊤xi+b)≥γ, ∀i\max_{\mathbf{w}, b} \quad \gamma \quad \text{s.t.} \quad y_i(\mathbf{w}^\top \mathbf{x}_i + b) \ge \gamma,\ \forall iw,bmaxγs.t.yi(w⊤xi+b)≥γ, ∀i
放缩 w,b\mathbf{w}, bw,b 可让 γ=1/∣w∣\gamma = 1 / |\mathbf{w}|γ=1/∣w∣,得到标准形式:
minw,b12∣w∣22s.t.yi(w⊤xi+b)≥1, ∀i\min_{\mathbf{w}, b} \quad \frac{1}{2}|\mathbf{w}|_2^2 \quad \text{s.t.} \quad y_i(\mathbf{w}^\top \mathbf{x}_i + b) \ge 1,\ \forall iw,bmin21∣w∣22s.t.yi(w⊤xi+b)≥1, ∀i
这是一个凸二次规划(QP)问题。
支持向量(Support Vectors)
间隔边界上的样本:yi(w⊤xi+b)=1y_i (\mathbf{w}^\top \mathbf{x}_i + b) = 1yi(w⊤xi+b)=1。它们"撑"住超平面,决定最优解。其它非边界样本对 w\mathbf{w}w 无影响------SVM 解的稀疏性来源。
为什么最大间隔?
- 统计学习理论 :Vapnik 证明,间隔 γ\gammaγ 越大,VC 维越小,泛化误差上界越紧。
- 几何直觉:把"决策边界"放在最宽敞的位置上,对噪声与未见过样本最鲁棒。
- 唯一性 :严格可分时最优超平面唯一(强凸二次规划)。
可视化
二维例子:黑/白两类点,最大间隔超平面就是距两类最近点距离都最远的那条线。距超平面最近的两点(每类一个)就是支持向量。
不可分情况
实际数据常线性不可分------两类点无法用一条直线分开。两种处理:
- 软间隔 SVM(§1.2):允许部分样本违反约束,用松弛变量容忍错误。
- 核技巧(§2.1):把数据映射到高维空间,使在新空间中线性可分。
scikit-learn 默认接口
python
from sklearn.svm import SVC
clf = SVC(C=1.0, kernel="rbf", gamma="scale").fit(X_train, y_train)
# C:软间隔惩罚(见 §1.2);kernel:核函数(见 §2);gamma:RBF 核带宽
易错点
- 未标准化 :SVM 对特征量级敏感(与 KNN 类似),必须先
StandardScaler。 - 核函数与
C、gamma联动 :C越大越不容忍错误(可能过拟合);gamma越大单个样本影响范围越小(可能过拟合)。gamma="scale"是 sklearn 默认(γ=1/(d⋅Var(X))\gamma = 1 / (d \cdot \text{Var}(X))γ=1/(d⋅Var(X)))。 - 数据规模大时训练慢 :SVM 训练复杂度 O(N2∼N3)O(N^2 \sim N^3)O(N2∼N3),10 万样本以上建议用
LinearSVC或近似(如 SGDClassifier + hinge loss)。 - 多分类默认 OvO :sklearn 的
SVC训练阶段按 OvO((K2)\binom{K}{2}(2K) 个二分类器)训练,但decision_function_shape默认'ovr',因此decision_function/predict_proba输出形状为 (N,K)(N, K)(N,K)。多分类需求大时用LinearSVC+ OvR 更高效。
1.2 软间隔
硬间隔 SVM 要求所有样本被正确分类,这在噪声数据或重叠数据上不可行。软间隔 SVM 引入松弛变量 ξi≥0\xi_i \ge 0ξi≥0,允许部分样本违反约束:
minw,b,ξ12∣w∣22+C∑i=1Nξi\min_{\mathbf{w}, b, \boldsymbol{\xi}} \quad \frac{1}{2}|\mathbf{w}|2^2 + C \sum{i=1}^N \xi_iw,b,ξmin21∣w∣22+Ci=1∑Nξi
s.t.yi(w⊤xi+b)≥1−ξi,ξi≥0\text{s.t.} \quad y_i(\mathbf{w}^\top \mathbf{x}_i + b) \ge 1 - \xi_i, \quad \xi_i \ge 0s.t.yi(w⊤xi+b)≥1−ξi,ξi≥0
- ξi=0\xi_i = 0ξi=0:样本在间隔边界外(正确且远离边界)。
- 0<ξi≤10 < \xi_i \le 10<ξi≤1:样本在间隔内部(正确但在边界之间)。
- ξi>1\xi_i > 1ξi>1:样本被错误分类(在超平面错误侧)。
正则化参数 CCC
L=12∣w∣22+C∑iξiL = \frac{1}{2}|\mathbf{w}|_2^2 + C \sum_i \xi_iL=21∣w∣22+Ci∑ξi
CCC 越大,对错误的惩罚越重 → 模型越倾向完美拟合训练集(可能过拟合)。C→∞C \to \inftyC→∞ 退化为硬间隔。CCC 越小,容错越强 → 模型越简单(可能欠拟合)。
直觉上,CCC 是"误分类"与"间隔宽度"的权衡系数------与第四章正则化中的 1/λ1/\lambda1/λ 同等角色。
Hinge 损失等价形式
软间隔 SVM 等价于带 hinge 损失的优化:
minw,b12∣w∣22+C∑i=1Nmax(0,1−yi(w⊤xi+b))\min_{\mathbf{w}, b} \quad \frac{1}{2}|\mathbf{w}|2^2 + C \sum{i=1}^N \max(0, 1 - y_i(\mathbf{w}^\top \mathbf{x}_i + b))w,bmin21∣w∣22+Ci=1∑Nmax(0,1−yi(w⊤xi+b))
定义 hinge loss:ℓ(z)=max(0,1−z)\ell(z) = \max(0, 1 - z)ℓ(z)=max(0,1−z),其中 z=yi(w⊤xi+b)z = y_i(\mathbf{w}^\top \mathbf{x}_i + b)z=yi(w⊤xi+b)。z≥1z \ge 1z≥1 时损失为 0,z<1z < 1z<1 时线性增长。
- hinge 损失是 0-1 损失的上界(凸、连续),便于优化。
- 与对数损失(logistic regression)相比,hinge 损失对远离边界的正确样本无奖励(损失严格为 0),更稀疏。
合页损失 vs 交叉熵
| 维度 | hinge | 交叉熵(log loss) |
|---|---|---|
| 严格 0 损失 | 边界外严格 0 | 永远 > 0 |
| 概率输出 | ✗(需 Platt scaling) | ✓(直接) |
| 鲁棒性 | 对远离边界正确样本不再优化 | 仍会被"过度自信"梯度推动 |
| 稀疏解 | ✓ | ✗ |
scikit-learn 中的 CCC 参数
python
from sklearn.svm import SVC, LinearSVC
# 通用接口:O(N²) 训练复杂度
clf = SVC(C=1.0, kernel="linear").fit(X_train, y_train)
# 线性核专用:O(N) 训练复杂度(用 liblinear)
clf = LinearSVC(C=1.0, loss="squared_hinge", max_iter=1000).fit(X_train, y_train)
注意 LinearSVC 的 C 是软间隔参数,与 LogisticRegression(C=...) 的 C 同等含义。
ν\nuν-SVM(替代参数化)
sklearn 提供 NuSVC(与 SVC 并列的经典接口),用 ν∈(0,1]\nu \in (0, 1]ν∈(0,1] 替代 CCC:
- ν\nuν 是支持向量比例的下界 (即支持向量占总样本比例 ≥ν\ge \nu≥ν)。
- ν\nuν 是间隔误差(margin error)比例的上界 ------间隔误差包含被错分类样本与落在间隔内(ξi>0\xi_i > 0ξi>0)的样本两类。
- 与 CCC 互为单调映射,但 ν\nuν 的几何/统计意义更直观。
SVM 的概率输出
SVM 原始输出是 w⊤x+b\mathbf{w}^\top \mathbf{x} + bw⊤x+b(实数)。要概率需后处理:
- Platt scaling :在 SVM 输出上拟合 sigmoid P(y=1∣x)=σ(Af(x)+B)P(y=1 | x) = \sigma(A f(x) + B)P(y=1∣x)=σ(Af(x)+B),A,BA, BA,B 通过最大似然估计。
- sklearn 的
SVC(probability=True).predict_proba(X)内部已做 Platt scaling(用 5 折 CV 训练额外的 sigmoid)。 - 代价:训练时间增加(额外 CV 拟合)。
易错点
- CCC 与误分类权衡混淆 :CCC 大 → 严格;CCC 小 → 宽松。与 KNN 的 kkk 选择是相反的直觉(kkk 大 → 平滑;CCC 大 → 严格)。
LinearSVCvsSVC(kernel="linear"):两者等价但实现不同,LinearSVC用 liblinear 快很多;SVC(kernel="linear")用 libsvm,支持probability=True与decision_function_shape。- 稀疏数据 :SVM 对稀疏高维数据(如文本)效果很好,但要确保
kernel适合------稀疏向量间的线性核或 χ2\chi^2χ2 核更合适。 - 类别不平衡 :软间隔的 CCC 对所有类别同权;可设
class_weight="balanced"让模型关注少数类。
1.3 对偶问题
凸二次规划可转化为对偶问题 求解------这对 SVM 至关重要,因为它引出核方法 和支持向量的稀疏性。
Lagrange 形式
对软间隔 SVM,引入拉格朗日乘子 αi≥0\alpha_i \ge 0αi≥0(对应 yif(xi)≥1−ξiy_i f(\mathbf{x}_i) \ge 1 - \xi_iyif(xi)≥1−ξi 约束)和 μi≥0\mu_i \ge 0μi≥0(对应 ξi≥0\xi_i \ge 0ξi≥0),Lagrangian:
L=12∣w∣22+C∑iξi−∑iαiyi(w⊤xi+b)−1+ξi−∑iμiξiL = \frac{1}{2}|\mathbf{w}|_2^2 + C \sum_i \xi_i - \sum_i \alpha_i y_i(\\mathbf{w}\^\\top \\mathbf{x}_i + b) - 1 + \\xi_i - \sum_i \mu_i \xi_iL=21∣w∣22+Ci∑ξi−i∑αiyi(w⊤xi+b)−1+ξi−i∑μiξi
对 w,b,ξi\mathbf{w}, b, \xi_iw,b,ξi 求偏导并令为 0(KKT 条件的一部分):
∂L∂w=w−∑iαiyixi=0 ⟹ w=∑iαiyixi\frac{\partial L}{\partial \mathbf{w}} = \mathbf{w} - \sum_i \alpha_i y_i \mathbf{x}_i = 0 \implies \mathbf{w} = \sum_i \alpha_i y_i \mathbf{x}_i∂w∂L=w−i∑αiyixi=0⟹w=i∑αiyixi
∂L∂b=−∑iαiyi=0 ⟹ ∑iαiyi=0\frac{\partial L}{\partial b} = -\sum_i \alpha_i y_i = 0 \implies \sum_i \alpha_i y_i = 0∂b∂L=−i∑αiyi=0⟹i∑αiyi=0
∂L∂ξi=C−αi−μi=0 ⟹ 0≤αi≤C\frac{\partial L}{\partial \xi_i} = C - \alpha_i - \mu_i = 0 \implies 0 \le \alpha_i \le C∂ξi∂L=C−αi−μi=0⟹0≤αi≤C
代回 Lagrangian,消去 w,b,ξi\mathbf{w}, b, \xi_iw,b,ξi 得对偶问题:
maxα∑iαi−12∑i,jαiαjyiyjxi⊤xj\max_{\boldsymbol{\alpha}} \quad \sum_i \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j \mathbf{x}_i^\top \mathbf{x}_jαmaxi∑αi−21i,j∑αiαjyiyjxi⊤xj
s.t.0≤αi≤C,∑iαiyi=0\text{s.t.} \quad 0 \le \alpha_i \le C, \quad \sum_i \alpha_i y_i = 0s.t.0≤αi≤C,i∑αiyi=0
对偶解的含义
- αi=0\alpha_i = 0αi=0:样本在间隔边界外(正确且远离),不影响 w\mathbf{w}w。
- 0<αi<C0 < \alpha_i < C0<αi<C:由互补松弛 ξi=0\xi_i = 0ξi=0,样本恰好在间隔边界上(yif(xi)=1y_i f(\mathbf{x}_i) = 1yif(xi)=1),是支持向量。
- αi=C\alpha_i = Cαi=C:此时 μi=0\mu_i = 0μi=0 对 ξi\xi_iξi 不再约束(仅 ξi≥0\xi_i \ge 0ξi≥0),样本是支持向量但不保证 在边界上------可能落在间隔内(0<ξi≤10 < \xi_i \le 10<ξi≤1)、被错分(ξi>1\xi_i > 1ξi>1),也可能恰好 ξi=0\xi_i = 0ξi=0 停在边界上。
最优 w\mathbf{w}w 写成支持向量的线性组合:w∗=∑αi>0αiyixi\mathbf{w}^* = \sum_{\alpha_i > 0} \alpha_i y_i \mathbf{x}_iw∗=∑αi>0αiyixi。
对偶带来的好处
- 稀疏性 :只有支持向量(αi>0\alpha_i > 0αi>0)的 xi\mathbf{x}_ixi 影响 w\mathbf{w}w;训练后丢弃非支持向量。
- 核化入口 :对偶问题只出现 xi⊤xj\mathbf{x}_i^\top \mathbf{x}_jxi⊤xj------可以替换为核函数 K(xi,xj)K(\mathbf{x}_i, \mathbf{x}_j)K(xi,xj) 而无需知道 ϕ(x)\phi(\mathbf{x})ϕ(x) 显式形式。这是核技巧的数学基础(§2.1)。
- 求解算法(SMO) :对偶是 QP,规模 N×NN \times NN×N,但有特殊结构(变量被约束 0≤αi≤C0 \le \alpha_i \le C0≤αi≤C 且 ∑αiyi=0\sum \alpha_i y_i = 0∑αiyi=0),可用高效分块优化(§1.4)。
KKT 条件(最优性判据)
对偶问题最优时,原问题与对偶问题都满足 KKT 条件:
- αi≥0\alpha_i \ge 0αi≥0,αiyif(xi)−1+ξi=0\alpha_i y_i f(\\mathbf{x}_i) - 1 + \\xi_i = 0αiyif(xi)−1+ξi=0(互补松弛)
- C−αi−μi=0C - \alpha_i - \mu_i = 0C−αi−μi=0
- yif(xi)≥1−ξiy_i f(\mathbf{x}_i) \ge 1 - \xi_iyif(xi)≥1−ξi,ξi≥0\xi_i \ge 0ξi≥0
KKT 残差常用于判断 SMO 是否收敛。
稀疏性的代价
对偶的稀疏性使预测只依赖支持向量,但训练仍需访问全部样本(w\mathbf{w}w 不再显式存储但 K(xi,xj)K(\mathbf{x}_i, \mathbf{x}_j)K(xi,xj) 仍要算)。预测复杂度 O(∣SV∣⋅d)O(|SV| \cdot d)O(∣SV∣⋅d),∣SV∣|SV|∣SV∣ 远小于 NNN。
与原始问题的对比
| 维度 | 原始 | 对偶 |
|---|---|---|
| 变量 | w,b,ξi\mathbf{w}, b, \xi_iw,b,ξi(d+1+Nd + 1 + Nd+1+N 维) | αi\alpha_iαi(NNN 维) |
| 约束 | 2N2N2N 个不等式 | 2N2N2N 个 box + 1 个等式 |
| 高维时 | w\mathbf{w}w 维度大 | α\alphaα 维度 = NNN(独立) |
| 核化 | 不直接 | xi⊤xj\mathbf{x}_i^\top \mathbf{x}_jxi⊤xj 可替换为 K(xi,xj)K(\mathbf{x}_i, \mathbf{x}_j)K(xi,xj) |
| 稀疏性 | 无 | αi=0\alpha_i = 0αi=0 大量 |
易错点
- 忘记 ∑αiyi=0\sum \alpha_i y_i = 0∑αiyi=0:对偶问题的等式约束,常被 SMO 用来同时选两个变量配对更新。
- 核函数正定性 :要让对偶 QP 有最优解,核矩阵 KKK 必须半正定。核矩阵非半正定时对偶问题失去凸性(一般非凸 QP,无全局最优保证)。常见核(RBF、poly 等)满足 Mercer 条件;sigmoid 核需校验。
- 支持向量与训练样本的比例:在强过拟合时几乎所有样本都是支持向量,稀疏性消失。
1.4 SMO 求解
SMO(Sequential Minimal Optimization, Platt 1998)是 SVM 对偶问题的标准求解算法。
SMO 思想
每次只优化 2 个变量 (αi,αj\alpha_i, \alpha_jαi,αj),其它 αk\alpha_kαk 固定。固定后,∑kαkyk=0\sum_k \alpha_k y_k = 0∑kαkyk=0 给出两个变量间的线性关系,2 维子问题可解析求解。
为什么 2 个?
只优化 1 个变量时,∑αkyk=0\sum \alpha_k y_k = 0∑αkyk=0 与 αi\alpha_iαi 单变量更新矛盾(无法在约束下调整)。至少 2 个才能保持约束。所以 2 是"最小可行更新块"。
两步迭代
- 启发式选对 :选 αi,αj\alpha_i, \alpha_jαi,αj。常用启发式:
- 外层循环 :遍历所有 αi\alpha_iαi(或违反 KKT 条件的 αi\alpha_iαi)。
- 内层循环 :对每个 αi\alpha_iαi 选 αj\alpha_jαj 使 ∣Ei−Ej∣|E_i - E_j|∣Ei−Ej∣ 最大(Ei=f(xi)−yiE_i = f(\mathbf{x}_i) - y_iEi=f(xi)−yi 是当前预测误差),可让目标函数下降最快。
- 联合优化 :固定其它 αk\alpha_kαk,对 αi,αj\alpha_i, \alpha_jαi,αj 求最优。子问题:
- 二次函数 aαi2+bαi+ca\alpha_i^2 + b\alpha_i + caαi2+bαi+c 在 box 约束 L≤αi≤HL \le \alpha_i \le HL≤αi≤H 上的最优解(裁剪到边界)。
- αj\alpha_jαj 由 αi\alpha_iαi 与等式约束算出。
子问题解析
设选定的两个变量是 α1,α2\alpha_1, \alpha_2α1,α2,固定 α3,...,αN\alpha_3, \dots, \alpha_Nα3,...,αN。记 Kij=xi⊤xjK_{ij} = \mathbf{x}_i^\top \mathbf{x}jKij=xi⊤xj(核化时 Kij=K(xi,xj)K{ij} = K(\mathbf{x}_i, \mathbf{x}_j)Kij=K(xi,xj)),Ei=f(xi)−yiE_i = f(\mathbf{x}_i) - y_iEi=f(xi)−yi(其中 f(xi)=∑jαjyjKij+bf(\mathbf{x}i) = \sum_j \alpha_j y_j K{ij} + bf(xi)=∑jαjyjKij+b)。
无约束最优 α2new=α2+y2(E1−E2)/η\alpha_2^{\text{new}} = \alpha_2 + y_2 (E_1 - E_2) / \etaα2new=α2+y2(E1−E2)/η,其中 η=K11+K22−2K12\eta = K_{11} + K_{22} - 2K_{12}η=K11+K22−2K12(是 KKK 在这两个样本上的"曲率")。
裁剪到 L≤α2new≤HL \le \alpha_2^{\text{new}} \le HL≤α2new≤H(L,HL, HL,H 由 CCC 与 y1,y2y_1, y_2y1,y2 决定),再算 α1new=α1+y1y2(α2old−α2new)\alpha_1^{\text{new}} = \alpha_1 + y_1 y_2 (\alpha_2^{\text{old}} - \alpha_2^{\text{new}})α1new=α1+y1y2(α2old−α2new)。
收敛判据
KKT 残差 ≤ϵ\le \epsilon≤ϵ(如 10−310^{-3}10−3)且迭代次数达到上限。SVC(tol=1e-3, max_iter=-1) 控制。
实际性能
- SMO 在中小数据集(N<104N < 10^4N<104)上极快。
- N>104N > 10^4N>104 时 SMO 仍可工作但慢,工业上改用
LinearSVC(liblinear 对偶坐标下降)或SGDClassifier(loss="hinge")等线性/近似方案。
对线性核的简化
线性核时 Kij=xi⊤xjK_{ij} = \mathbf{x}_i^\top \mathbf{x}_jKij=xi⊤xj,可把 w\mathbf{w}w 显式存为稠密向量,跳过核矩阵计算 → 训练复杂度约 O(Nd)O(N d)O(Nd),预测 O(d)O(d)O(d),与对偶/原始无关。LinearSVC 用 liblinear 库实现此路径:默认 loss="squared_hinge",dual="auto"(sklearn ≥1.3 引入,≥1.5 默认)按 NNN 与 ddd 比例自动选 primal / dual 形式。SGDClassifier(loss="hinge") 是大规模场景下的 SGD 近似解。
易错点
- 收敛后仍有 αi\alpha_iαi 在边界 :αi∈(0,C)\alpha_i \in (0, C)αi∈(0,C) 才是间隔边界上的支持向量;αi=0\alpha_i = 0αi=0 不影响 w\mathbf{w}w;αi=C\alpha_i = Cαi=C 是违反约束的样本。
max_iter不够 :大数据 + 强 CCC 时可能不收敛,报ConvergenceWarning。调大到 5000--10000。tol设过小:收敛到 1e-5 在百万样本上极慢;通常 1e-3 已足够。- 核矩阵大到内存放不下 :NNN 很大时 KKK 是 N×NN \times NN×N,可能 OOM;用
LinearSVC或核近似(§2.2)。
二、核方法
2.1 核技巧
核心思想
对偶 SVM 中 xi⊤xj\mathbf{x}_i^\top \mathbf{x}_jxi⊤xj 可替换为 K(xi,xj)K(\mathbf{x}_i, \mathbf{x}_j)K(xi,xj)------只要 KKK 是正定核 (Mercer 核),就等价于"在某个高维空间 H\mathcal{H}H 中做内积"。
- 显式映射 :ϕ:Rd→H\phi: \mathbb{R}^d \to \mathcal{H}ϕ:Rd→H,K(xi,xj)=⟨ϕ(xi),ϕ(xj)⟩HK(\mathbf{x}_i, \mathbf{x}_j) = \langle \phi(\mathbf{x}_i), \phi(\mathbf{x}j) \rangle{\mathcal{H}}K(xi,xj)=⟨ϕ(xi),ϕ(xj)⟩H。
- 隐式映射 :不需要显式知道 ϕ\phiϕ,只关心 KKK。当 H\mathcal{H}H 维数极高甚至无穷维时,避免显式映射的代价。
为什么能解决非线性问题
原始空间不可分的数据,在高维特征空间中可能线性可分。例如:ϕ(x1,x2)=(x12,2x1x2,x22)\phi(x_1, x_2) = (x_1^2, \sqrt{2} x_1 x_2, x_2^2)ϕ(x1,x2)=(x12,2 x1x2,x22) 把平面二次曲线映射到三维空间的内积------对偶 SVM 用 K(x,z)=(x⊤z)2K(\mathbf{x}, \mathbf{z}) = (\mathbf{x}^\top \mathbf{z})^2K(x,z)=(x⊤z)2 即等价于在那个三维空间做线性 SVM。
示例:二次多项式核的手算验证
取 x=(1,2)\mathbf{x} = (1, 2)x=(1,2),z=(3,4)\mathbf{z} = (3, 4)z=(3,4):
- 核侧:K(x,z)=(x⊤z)2=(1×3+2×4)2=112=121K(\mathbf{x}, \mathbf{z}) = (\mathbf{x}^\top \mathbf{z})^2 = (1 \times 3 + 2 \times 4)^2 = 11^2 = 121K(x,z)=(x⊤z)2=(1×3+2×4)2=112=121。
- 映射侧:ϕ(x)=(1,22,4)\phi(\mathbf{x}) = (1, 2\sqrt{2}, 4)ϕ(x)=(1,22 ,4),ϕ(z)=(9,122,16)\phi(\mathbf{z}) = (9, 12\sqrt{2}, 16)ϕ(z)=(9,122 ,16),内积 =9+(22)(122)+64=9+48+64=121= 9 + (2\sqrt{2})(12\sqrt{2}) + 64 = 9 + 48 + 64 = 121=9+(22 )(122 )+64=9+48+64=121。
两条路径结果一致------核函数"偷偷"完成了高维内积,且代价只有一次 ddd 维点积加平方。维度更高时差距更悬殊(见下文"多项式核的复杂度")。
Mercer 条件(正定核)
KKK 是正定核当且仅当对任意 NNN 个点,KKK 矩阵(Gram 矩阵)是半正定:
Kij=K(xi,xj),∀v∈RN, v⊤Kv≥0K_{ij} = K(\mathbf{x}_i, \mathbf{x}_j), \quad \forall \mathbf{v} \in \mathbb{R}^N,\ \mathbf{v}^\top K \mathbf{v} \ge 0Kij=K(xi,xj),∀v∈RN, v⊤Kv≥0
- 这等价于存在某个 H\mathcal{H}H 中的 ϕ\phiϕ 使 K(x,z)=⟨ϕ(x),ϕ(z)⟩K(\mathbf{x}, \mathbf{z}) = \langle \phi(\mathbf{x}), \phi(\mathbf{z}) \rangleK(x,z)=⟨ϕ(x),ϕ(z)⟩。
- Mercer 条件是充分必要的,验证方法:检查 Gram 矩阵是否半正定。
- 违反 Mercer 条件(核矩阵非半正定)→ 对偶 QP 失去凸性 → 算法可能不收敛或解无意义。
常用核函数
| 核 | 公式 | 含义 |
|---|---|---|
| 线性核 | K(x,z)=x⊤zK(\mathbf{x}, \mathbf{z}) = \mathbf{x}^\top \mathbf{z}K(x,z)=x⊤z | 不做升维(等价于线性 SVM) |
| 多项式核 | K(x,z)=(γx⊤z+c)dK(\mathbf{x}, \mathbf{z}) = (\gamma \mathbf{x}^\top \mathbf{z} + c)^dK(x,z)=(γx⊤z+c)d | ddd 次多项式特征映射(c=0c=0c=0 时齐次) |
| RBF(高斯)核 | $K(\mathbf{x}, \mathbf{z}) = \exp(-\gamma | \mathbf{x} - \mathbf{z} |
| Sigmoid 核 | K(x,z)=tanh(γx⊤z+c)K(\mathbf{x}, \mathbf{z}) = \tanh(\gamma \mathbf{x}^\top \mathbf{z} + c)K(x,z)=tanh(γx⊤z+c) | 仅在某些参数下正定,需校验 |
| χ2\chi^2χ2 核 | K(x,z)=exp(−γ∑i(xi−zi)2/(xi+zi))K(\mathbf{x}, \mathbf{z}) = \exp(-\gamma \sum_i (x_i - z_i)^2 / (x_i + z_i))K(x,z)=exp(−γ∑i(xi−zi)2/(xi+zi)) | 直方图、图像特征常用 |
RBF 核的细节
K(x,z)=exp(−γ∣x−z∣22)K(\mathbf{x}, \mathbf{z}) = \exp(-\gamma |\mathbf{x} - \mathbf{z}|_2^2)K(x,z)=exp(−γ∣x−z∣22)
- γ>0\gamma > 0γ>0 是带宽参数。γ\gammaγ 越大 → 核衰减越快 → 局部性强 → 易过拟合。
- 等价于无穷维特征空间中的内积(泰勒展开对应无穷多项),可拟合任意复杂决策边界。
- 是 sklearn
SVC的默认核。
多项式核的复杂度
非齐次多项式核 K(x,z)=(γx⊤z+c)dK(\mathbf{x}, \mathbf{z}) = (\gamma \mathbf{x}^\top \mathbf{z} + c)^dK(x,z)=(γx⊤z+c)d(c>0c > 0c>0)等价于 (d+d′d)\binom{d + d'}{d}(dd+d′) 维特征空间(d′d'd′ 是原始维度);齐次核 (x⊤z)d(\mathbf{x}^\top \mathbf{z})^d(x⊤z)d 对应 (d+d′−1d)\binom{d + d' - 1}{d}(dd+d′−1) 维。d=2,d′=100d = 2, d' = 100d=2,d′=100 时非齐次已是 ~5000 维。显式映射不可行,核技巧是唯一实用办法。
特征空间视角的边界
SVM 在核空间 H\mathcal{H}H 学得线性超平面 f(x)=w⊤ϕ(x)+b=0f(\mathbf{x}) = \mathbf{w}^\top \phi(\mathbf{x}) + b = 0f(x)=w⊤ϕ(x)+b=0,在原空间是非线性曲面(圆、椭圆、高阶多项式等)。这就是 SVM 处理非线性问题的本质。
核函数的选择
经验性原则:
- 先试 RBF :通用性强,参数少(γ\gammaγ)。
- 特征数 >> 样本数:用线性核(避免 RBF 的过拟合与高计算成本)。
- 样本数 >> 特征数:RBF 效果通常更好。
- 领域知识 :图像/文本用 χ2\chi^2χ2、字符串用字符串核、图用 graph kernel。
自定义核
python
def my_kernel(X, Y):
# X: (n1, d), Y: (n2, d),返回 (n1, n2) Gram 矩阵
return X @ Y.T # 线性核示例
clf = SVC(kernel=my_kernel).fit(X_train, y_train)
核技巧的局限
- 计算成本 :预测时仍需算 K(x,xi)K(\mathbf{x}, \mathbf{x}_i)K(x,xi) 对每个支持向量;∣SV∣×d|SV| \times d∣SV∣×d 的复杂度。
- 核矩阵内存 :对偶 QP 在 KKK 上求解,NNN 大时 O(N2)O(N^2)O(N2) 内存。
- 可解释性 :核空间高维或无穷维,ϕ(x)\phi(\mathbf{x})ϕ(x) 不可解释。
- 核选择依赖经验:理论上"通用核"存在但难构造。
易错点
- 忘记先
StandardScaler:核值受量级影响大;RBF 核 γ=1\gamma = 1γ=1 在 0--1 数据上与在 0--1000 数据上效果截然不同。 gamma与C联动 :gamma控局部性,C控严格性,两者常需一起调。- 核非正定:自定义核必须验证 Gram 矩阵半正定。
- RBF 在高维稀疏数据上失效 :RBF 的 exp(−γ∣x−z∣2)\exp(-\gamma |\mathbf{x} - \mathbf{z}|^2)exp(−γ∣x−z∣2) 依赖样本间的欧氏距离;在高维稀疏向量上,所有样本间的距离集中在一个较窄的区间(curse of dimensionality),核矩阵各元素趋于相同值,模型失去区分度,RBF 失效。
2.2 核函数选择
线性核
K(x,z)=x⊤zK(\mathbf{x}, \mathbf{z}) = \mathbf{x}^\top \mathbf{z}K(x,z)=x⊤z
- 不做升维,等价于线性 SVM。
- 适用:高维稀疏数据(文本 TF-IDF)、特征数 >> 样本数。
- 优势:可解释、训练极快(
LinearSVC)、可扩展到百万级样本。 - 限制:只能学线性决策边界。
多项式核
K(x,z)=(γx⊤z+c)dK(\mathbf{x}, \mathbf{z}) = (\gamma \mathbf{x}^\top \mathbf{z} + c)^dK(x,z)=(γx⊤z+c)d
- γ\gammaγ:缩放系数(>0);ccc:常数项;ddd:多项式阶数。
- d=2d = 2d=2:椭圆/抛物线决策边界。
- d=3d = 3d=3:三次曲线。
- 经验:ddd 通常取 2 或 3,再大易数值不稳定(γx⊤z\gamma \mathbf{x}^\top \mathbf{z}γx⊤z 很大时 γd\gamma^dγd 指数增长)。
RBF(径向基函数 / 高斯)核
K(x,z)=exp(−γ∣x−z∣22)K(\mathbf{x}, \mathbf{z}) = \exp(-\gamma |\mathbf{x} - \mathbf{z}|_2^2)K(x,z)=exp(−γ∣x−z∣22)
- 最常用,对多数数据效果好。
- γ\gammaγ 的"经验法则":
gamma="scale"(sklearn 默认)= 1/(d⋅Var(X))1 / (d \cdot \text{Var}(X))1/(d⋅Var(X))gamma="auto"= 1/d1 / d1/d- 手动扫描:γ∈{0.001,0.01,0.1,1,10,100}\gamma \in \{0.001, 0.01, 0.1, 1, 10, 100\}γ∈{0.001,0.01,0.1,1,10,100}
- γ\gammaγ 越大 → 单个样本影响范围越小 → 模型越复杂。
Sigmoid 核
K(x,z)=tanh(γx⊤z+c)K(\mathbf{x}, \mathbf{z}) = \tanh(\gamma \mathbf{x}^\top \mathbf{z} + c)K(x,z)=tanh(γx⊤z+c)
- 与神经网络激活函数形式相似。
- 非 Mercer 核 (仅在某些 γ,c\gamma, cγ,c 组合下半正定)。工程上用时必须验证。
- 实践上很少用,效果不如 RBF。
χ2\chi^2χ2 核
K(x,z)=exp(−γ∑i(xi−zi)2xi+zi)K(\mathbf{x}, \mathbf{z}) = \exp\left(-\gamma \sum_i \frac{(x_i - z_i)^2}{x_i + z_i}\right)K(x,z)=exp(−γi∑xi+zi(xi−zi)2)
- 直方图(图像特征、词频)上常用。
- 加权欧氏距离,照顾计数/频率型特征的尺度。
字符串核 / 图核
- 字符串子序列核:文本中公共子串的数量加权。
- 图核:图的子图同构计数。
- 领域专用核。
多个核的组合
- 多核学习(MKL) :学习多个核的加权和,∑mβmKm\sum_m \beta_m K_m∑mβmKm,βm≥0\beta_m \ge 0βm≥0。
- 直和 :K=K1⊕K2K = K_1 \oplus K_2K=K1⊕K2(特征拼接)。
- 直积 :K=K1⊗K2K = K_1 \otimes K_2K=K1⊗K2(特征张量积)。
核选择流程
#mermaid-svg-s18nHeLKeSq3Lumh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-s18nHeLKeSq3Lumh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-s18nHeLKeSq3Lumh .error-icon{fill:#552222;}#mermaid-svg-s18nHeLKeSq3Lumh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s18nHeLKeSq3Lumh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s18nHeLKeSq3Lumh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s18nHeLKeSq3Lumh .marker.cross{stroke:#333333;}#mermaid-svg-s18nHeLKeSq3Lumh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s18nHeLKeSq3Lumh p{margin:0;}#mermaid-svg-s18nHeLKeSq3Lumh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-s18nHeLKeSq3Lumh .cluster-label text{fill:#333;}#mermaid-svg-s18nHeLKeSq3Lumh .cluster-label span{color:#333;}#mermaid-svg-s18nHeLKeSq3Lumh .cluster-label span p{background-color:transparent;}#mermaid-svg-s18nHeLKeSq3Lumh .label text,#mermaid-svg-s18nHeLKeSq3Lumh span{fill:#333;color:#333;}#mermaid-svg-s18nHeLKeSq3Lumh .node rect,#mermaid-svg-s18nHeLKeSq3Lumh .node circle,#mermaid-svg-s18nHeLKeSq3Lumh .node ellipse,#mermaid-svg-s18nHeLKeSq3Lumh .node polygon,#mermaid-svg-s18nHeLKeSq3Lumh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-s18nHeLKeSq3Lumh .rough-node .label text,#mermaid-svg-s18nHeLKeSq3Lumh .node .label text,#mermaid-svg-s18nHeLKeSq3Lumh .image-shape .label,#mermaid-svg-s18nHeLKeSq3Lumh .icon-shape .label{text-anchor:middle;}#mermaid-svg-s18nHeLKeSq3Lumh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-s18nHeLKeSq3Lumh .rough-node .label,#mermaid-svg-s18nHeLKeSq3Lumh .node .label,#mermaid-svg-s18nHeLKeSq3Lumh .image-shape .label,#mermaid-svg-s18nHeLKeSq3Lumh .icon-shape .label{text-align:center;}#mermaid-svg-s18nHeLKeSq3Lumh .node.clickable{cursor:pointer;}#mermaid-svg-s18nHeLKeSq3Lumh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-s18nHeLKeSq3Lumh .arrowheadPath{fill:#333333;}#mermaid-svg-s18nHeLKeSq3Lumh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-s18nHeLKeSq3Lumh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-s18nHeLKeSq3Lumh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s18nHeLKeSq3Lumh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-s18nHeLKeSq3Lumh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s18nHeLKeSq3Lumh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-s18nHeLKeSq3Lumh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-s18nHeLKeSq3Lumh .cluster text{fill:#333;}#mermaid-svg-s18nHeLKeSq3Lumh .cluster span{color:#333;}#mermaid-svg-s18nHeLKeSq3Lumh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-s18nHeLKeSq3Lumh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-s18nHeLKeSq3Lumh rect.text{fill:none;stroke-width:0;}#mermaid-svg-s18nHeLKeSq3Lumh .icon-shape,#mermaid-svg-s18nHeLKeSq3Lumh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s18nHeLKeSq3Lumh .icon-shape p,#mermaid-svg-s18nHeLKeSq3Lumh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-s18nHeLKeSq3Lumh .icon-shape .label rect,#mermaid-svg-s18nHeLKeSq3Lumh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s18nHeLKeSq3Lumh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-s18nHeLKeSq3Lumh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-s18nHeLKeSq3Lumh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} d >> N
d ≈ N
d << N
N < 10^4
N >= 10^4
欠拟合
过拟合
开始
特征维度
线性核
线性核或 RBF
样本数
RBF 调参
线性核 or 核近似
gamma 网格扫描
效果
增大 gamma 或增大 C 或换 poly 核
减小 gamma 或减小 C
核近似(Nyström / Random Fourier Features)
当 NNN 太大核矩阵放不下时,用低秩近似:
- Nyström 方法 :从 NNN 个样本中抽 m≪Nm \ll Nm≪N 个基点 ,构造 K~=KN,mKm−1KN,m⊤\tilde K = K_{N, m} K_m^{-1} K_{N, m}^\topK~=KN,mKm−1KN,m⊤。
- Random Fourier Features (RFF) :基于 Bochner 定理,对平移不变核 K(x,z)=K(x−z)K(\mathbf{x}, \mathbf{z}) = K(\mathbf{x} - \mathbf{z})K(x,z)=K(x−z),有
K(x,z)=Eω∼p(ω)2cos(ω⊤x+b)2cos(ω⊤z+b)K(\mathbf{x}, \mathbf{z}) = \mathbb{E}_{\omega \sim p(\omega)} \\sqrt{2} \\cos(\\omega\^\\top \\mathbf{x} + b)\\sqrt{2} \\cos(\\omega\^\\top \\mathbf{z} + b)K(x,z)=Eω∼p(ω)2 cos(ω⊤x+b)2 cos(ω⊤z+b)
采 DDD 个 ω\omegaω 得到显式 ϕ~(x)∈RD\tilde\phi(\mathbf{x}) \in \mathbb{R}^Dϕ~(x)∈RD。sklearn 的kernel_approximation.Nystroem(自 0.13)与RBFSampler(自 0.18)长期提供。
核选择的工程原则
- 数据量小时 :用 RBF,γ\gammaγ 与 CCC 一起网格搜索。
- 数据量大时:用线性核或近似核。
- 先验知识强时:用领域核(如文本 → 字符串/线性核、图 → graph kernel)。
- 交叉验证选超参 :γ\gammaγ、CCC、核参数(多项式 ddd、RBF γ\gammaγ)一起用
GridSearchCV或RandomizedSearchCV。
scikit-learn 用例
python
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
param_grid = {
"C": [0.1, 1, 10],
"gamma": [0.001, 0.01, 0.1, 1, 10],
}
grid = GridSearchCV(SVC(kernel="rbf"), param_grid, cv=5, scoring="accuracy")
grid.fit(X_train, y_train)
print(grid.best_params_, grid.best_score_)
易错点
gamma越调越大 会出现"训练 100%、测试 50%"------过拟合。γ\gammaγ 太大时每个样本只影响自身附近的预测,决策边界高度扭曲。- 同时调
C与gamma:用网格搜索而非手动;两者常需同时调整。 - 类别不平衡 + RBF :默认
class_weight=None时模型偏向多数类;用class_weight="balanced"调整。 - 核选择不交叉验证 :直接用默认 RBF + 默认 γ\gammaγ 在新数据上常常不是最优;至少做一次粗网格。
- 核与数据不匹配:文本/稀疏高维 → RBF 几乎无效(理由见 §2.1),应改线性核。
2.3 SVR(支持向量回归)
SVM 的回归版本。核心变化:不再要求预测逐点贴合 yyy,而是容忍 ±ϵ\pm\epsilon±ϵ 的偏差------只有落在 ϵ\epsilonϵ-管道之外的样本才产生损失:
minw,b 12∣w∣22+C∑i(ξi+ξi∗)s.t. {yi−w⊤xi−b≤ϵ+ξiw⊤xi+b−yi≤ϵ+ξi∗ξi,ξi∗≥0\min_{\mathbf{w}, b} \ \frac{1}{2}|\mathbf{w}|_2^2 + C \sum_i (\xi_i + \xi_i^*) \quad \text{s.t.} \ \begin{cases} y_i - \mathbf{w}^\top\mathbf{x}_i - b \le \epsilon + \xi_i \\ \mathbf{w}^\top\mathbf{x}_i + b - y_i \le \epsilon + \xi_i^* \\ \xi_i, \xi_i^* \ge 0 \end{cases}w,bmin 21∣w∣22+Ci∑(ξi+ξi∗)s.t. ⎩ ⎨ ⎧yi−w⊤xi−b≤ϵ+ξiw⊤xi+b−yi≤ϵ+ξi∗ξi,ξi∗≥0
- ε-不敏感损失 :Lϵ(y,f)=max(0, ∣y−f(x)∣−ϵ)L_\epsilon(y, f) = \max(0, \ |y - f(\mathbf{x})| - \epsilon)Lϵ(y,f)=max(0, ∣y−f(x)∣−ϵ)。残差在 −ϵ,ϵ-\\epsilon, \\epsilon−ϵ,ϵ 内损失严格为 0。
- 管道之外(或恰在管道边界上)的样本才是支持向量 → 解依然稀疏,这是 SVR 与普通最小二乘的本质区别。
- ϵ\epsilonϵ 越大 → 管道越宽 → 支持向量越少、模型越平滑;ϵ→0\epsilon \to 0ϵ→0 退化为对所有样本敏感。
- 对偶形式与分类 SVM 同构(内积换成核)→ 核化 SVR 可拟合非线性回归,几何直觉是"在特征空间里用一条宽管道去套数据"。
- 超参:CCC(管道外惩罚)、ϵ\epsilonϵ(管道宽度)、核参数(RBF 的 γ\gammaγ)。经验:先标准化特征;ϵ\epsilonϵ 从 yyy 标准差的 5%--10% 起步。
python
from sklearn.svm import SVR
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
reg = make_pipeline(
StandardScaler(),
SVR(kernel="rbf", C=1.0, epsilon=0.1, gamma="scale"),
)
reg.fit(X_train, y_train)
与第四章线性回归的对比:线性 SVR ≈ 用 ε-不敏感损失的线性回归(只惩罚管道外误差),最小二乘则对所有样本的平方误差都敏感。样本量大、或需要概率/分位数输出时,线性模型 / 树模型 / GBDT 通常是更省心的选择;SVR 的优势在中等规模、非线性、希望解稀疏的场景。