观文听傑

返回

上一篇的线性支持向量机(Support Vector Machine,SVM)用最大间隔选择稳定超平面,并用软间隔容忍噪声。但同心圆、弯月形和异或(XOR)数据在原始空间中根本不存在一条直线能分开。

一种办法是手工增加 x12x_1^2x1x2x_1x_2 等非线性特征,再训练线性 SVM。问题是高阶组合的维数会快速爆炸,而且我们最后真正需要的,往往不是每个新坐标本身,而只是样本在新空间中的点积。

核技巧(Kernel Trick)利用这个缺口:不显式构造高维特征,只计算两点映射后的内积。 本文沿“对偶表示 → 核函数 → RBF 相似度 → 工程选择”讲透这条数据流。

01 一条直线为什么分不开同心圆?#

设二维样本的类别只取决于半径:圆心附近是负类,外环是正类。

x₂
▲          +   +   +
│       +           +
│     +     ○ ○       +
│     +    ○ ○ ○      +
│       +    ○      +
│          +   +
└────────────────────► x₁

原始空间:任何直线都会同时切到内圈和外圈
text

若增加一个特征:

z=x12+x22z=x_1^2+x_2^2

内圈的 zz 小,外圈的 zz 大,只需在 zz 轴设阈值就能线性分开。也就是说,原空间中的弯曲边界,可能是另一个特征空间中的超平面。

更一般地,用映射 ϕ\phi 把输入送入新的特征空间:

ϕ:RDH\phi:\mathbb{R}^{D}\rightarrow\mathcal H

然后学习:

f(x)=wϕ(x)+bf(x)=w^\top\phi(x)+b

困难在于 H\mathcal H 可能有成千上万维,甚至无限维;显式计算和存储 ϕ(X)\phi(X) 会很昂贵。

02 为什么 SVM 最终只需要样本之间的点积?#

上一篇写过软间隔原始问题(Primal Problem):

minw,b,ξ12w22+Ciξi\min_{w,b,\xi}\frac12\|w\|_2^2+C\sum_i\xi_i

满足:

yi(wxi+b)1ξi,ξi0y_i(w^\top x_i+b)\ge1-\xi_i,\qquad \xi_i\ge0

通过拉格朗日乘子把约束并入目标,可以得到对偶问题(Dual Problem):

\max_{\alpha}\quad \sum_{i=1}^{N}\alpha_i- rac12 \sum_{i=1}^{N}\sum_{j=1}^{N} \alpha_i\alpha_jy_iy_j\langle x_i,x_j\rangle

满足:

0αiC,iαiyi=00\le\alpha_i\le C,\qquad \sum_i\alpha_i y_i=0
  • αi\alpha_i:第 ii 个训练约束的乘子;
  • CC:每个乘子的上界,同时控制软间隔违规代价;
  • xi,xj=xixj\langle x_i,x_j\rangle=x_i^\top x_j:两个训练样本的点积;
  • 只有 αi>0\alpha_i>0 的训练点会进入最终决策函数,它们就是支持向量。

最优权重可写成训练样本的线性组合:

w=i=1Nαiyixiw=\sum_{i=1}^{N}\alpha_i y_i x_i

因此新样本的分数是:

f(x)=i=1Nαiyixi,x+bf(x)=\sum_{i=1}^{N}\alpha_i y_i\langle x_i,x\rangle+b

许多 αi\alpha_i 为 0,实际只需支持向量集合 S\mathcal S

f(x)=iSαiyixi,x+bf(x)=\sum_{i\in\mathcal S}\alpha_i y_i\langle x_i,x\rangle+b

关键线索出现了:训练和预测都只通过点积比较样本。

03 核技巧到底替换了什么?#

若先映射 ϕ(x)\phi(x),对偶中出现的是:

ϕ(xi),ϕ(xj)\langle\phi(x_i),\phi(x_j)\rangle

核函数(Kernel Function)直接返回这个内积:

K(xi,xj)=ϕ(xi),ϕ(xj)K(x_i,x_j)=\langle\phi(x_i),\phi(x_j)\rangle

于是决策函数变成:

f(x)=iSαiyiK(xi,x)+bf(x)=\sum_{i\in\mathcal S}\alpha_i y_iK(x_i,x)+b

数据流从“显式造特征”变成“计算相似度矩阵”:

训练:X_train [N,D]
          │ 两两核函数 K(x_i,x_j)

      Gram matrix K_train [N,N]
          │ 对偶优化

  support vectors [S,D] + dual coefficients [S]

推理:X_query [Q,D] × support vectors [S,D]
          │ 核函数

      K_query [Q,S]
          │ 加权求和 + b

       decision score [Q]
text

这里的格拉姆矩阵(Gram Matrix)第 (i,j)(i,j) 项是 K(xi,xj)K(x_i,x_j)。并非任意“相似度”都能安全作为核;合法核必须对应某个内积空间,常用充分条件是对任意有限样本得到的 Gram 矩阵为半正定。

一个显式可验证的二次核#

对二维输入,令:

ϕ(x)=[x12,2x1x2,x22]\phi(x)=[x_1^2,\sqrt2x_1x_2,x_2^2]^\top

则:

ϕ(x)ϕ(z)=x12z12+2x1x2z1z2+x22z22=(xz)2\phi(x)^\top\phi(z) =x_1^2z_1^2+2x_1x_2z_1z_2+x_2^2z_2^2 =(x^\top z)^2

因此 K(x,z)=(xz)2K(x,z)=(x^\top z)^2 隐式包含所有二次交互。我们只算原空间的点积再平方,不必为每个样本显式保存三维 ϕ(x)\phi(x)。高维、高阶时节省更明显。

04 RBF 核怎样把“近”变成影响力?#

径向基函数核(Radial Basis Function Kernel,RBF),也常称高斯核,定义为:

K(x,z)=exp(γxz22)K(x,z)=\exp\left(-\gamma\|x-z\|_2^2\right)
  • x,zRDx,z\in\mathbb{R}^{D}:两个已按训练统计量缩放的样本;
  • xz22\|x-z\|_2^2:平方欧氏距离;
  • γ>0\gamma>0:单个样本影响范围的倒数尺度;
  • K(x,z)(0,1]K(x,z)\in(0,1]:两点相同为 1,距离增大时趋近 0。
距离 xz\|x-z\|γ=0.25\gamma=0.25γ=1\gamma=1γ=4\gamma=4
01.0001.0001.000
10.7790.3680.018
20.3680.0180\approx0

γ\gamma 让一个支持向量影响很远,边界更平滑;大 γ\gamma 让影响集中在很小邻域,模型能绕着单个样本急转弯,也更容易追逐噪声。

K(x,z)
▲      gamma 大
│       /\
│      /  \             gamma 小
│ ____/    \____       __/¯¯¯¯\__
└────────────────────────────────► distance
        窄影响              宽影响
text

05 用两个支持向量手算一次预测#

考虑一维的两个支持向量:

x₁ = -1, y₁ = -1, alpha₁ = 1
x₂ = +1, y₂ = +1, alpha₂ = 1
b = 0, gamma = 1
text

决策函数为:

f(x)=K(1,x)+K(1,x)f(x)=-K(-1,x)+K(1,x)

查询 x=0x=0 时,两边距离相同:

K(1,0)=K(1,0)=e10.368K(-1,0)=K(1,0)=e^{-1}\approx0.368

所以 f(0)=0f(0)=0,正好在边界上。

查询 x=0.5x=0.5 时:

K(1,0.5)=e2.250.105K(-1,0.5)=e^{-2.25}\approx0.105 K(1,0.5)=e0.250.779K(1,0.5)=e^{-0.25}\approx0.779 f(0.5)=0.105+0.779=0.674f(0.5)=-0.105+0.779=0.674

因此预测正类。这个分数不是“最近邻投票”,而是所有支持向量的带符号、带系数相似度之和。

交互手算:查询点移到 x=3

K(1,3)=e160K(-1,3)=e^{-16}\approx0K(1,3)=e40.018K(1,3)=e^{-4}\approx0.018,所以分数仍略为正,但非常接近 0。RBF SVM 不擅长在训练范围外产生线性外推;远离所有支持向量时,各项都会衰减。

06 C 与 gamma 为什么必须联合选择?#

Cgamma 控制不同维度,却会共同决定边界:

设置单点影响范围违反训练间隔的价格常见边界
γ\gamma、小 CC很平滑,可能欠拟合
γ\gamma、大 CC努力用平滑边界分对
γ\gamma、小 CC局部影响强但允许错误
γ\gamma、大 CC绕样本急转,容易过拟合

只调一个参数会误判另一个参数的作用。例如大 γ\gamma 提供了极强局部容量,但若 CC 很小,优化器仍可能宁可容忍训练错误;反过来,大 CC 也无法让过小 γ\gamma 表达细小结构。

scikit-learn 1.9 中 gamma='scale' 使用:

γ=1DVar(X)\gamma=\frac{1}{D\cdot\operatorname{Var}(X)}

它是合理起点,不是经过验证的最优值。由于方差和距离都受单位影响,标准化仍必须放进 Pipeline。

07 不调用 SVC:先验证核矩阵和数据流#

下面用 NumPy 显式计算 RBF Gram 矩阵,并用前面的两个支持向量完成预测:

距离公式用矩阵乘法避免创建 [N,M,D] 的巨大差值张量;由于浮点舍入,理论上非负的平方距离可能出现极小负数,所以在指数前截到 0。

真实 SVCdual_coef_ 已经包含类别符号;多分类时其布局更复杂,不要把二分类示例直接推广为手写多分类推理。

08 用 scikit-learn 1.9 训练 RBF SVM#

官方当前接口中 SVC 默认核就是 RBF,但正式代码应显式写出关键选择,并在对数尺度联合搜索 CCγ\gamma

重要接口语义:

  • support_ 是训练行索引 [S]support_vectors_ 是经过 Pipeline 标准化后的支持向量 [S,D]
  • 二分类 decision_function 返回 [Q],正负方向对应 classes_ 的顺序;它不是概率;
  • cache_size 单位是 MB,增大核缓存可能提速,但会增加每个并发训练进程的内存;
  • class_weight='balanced' 会按类别频率缩放各类有效 CC,不能替代合适指标和阈值设计;
  • SVC 内部多分类使用一对一(One-vs-One),默认只把决策输出整理成一对其余风格。

例如在超参数冻结后重新以交叉验证校准:

from sklearn.calibration import CalibratedClassifierCV

calibrated = CalibratedClassifierCV(
    estimator=search.best_estimator_,
    method='sigmoid',
    cv=5,
    ensemble=False,
)
calibrated.fit(X_train, y_train)
probability = calibrated.predict_proba(X_val)  # [num_val, num_classes]
python

校准本身也是模型选择的一部分。测试集不能用于拟合校准器或选择 sigmoid/isotonic

09 训练为何会突然变得很慢?#

核 SVM 的代价来自样本两两关系。完整 Gram 矩阵有 N2N^2 个元素;SVC 的训练时间至少随样本数二次增长,在数万样本以上常变得不实用。预测成本又约随支持向量数 SS 增长:

单批推理核计算量 ≈ Q × S × D
模型状态至少包含 S 个支持向量
text

如果类别高度重叠,很多训练点会成为支持向量,模型体积和延迟都会上升。工程检查应同时记录:

  • 样本数 NN 与支持向量数 SS
  • S/N 支持向量比例;
  • 交叉验证每折训练时间和峰值内存;
  • 批量吞吐、P50/P99 推理延迟;
  • 标准化器、支持向量和库版本。

数据较大时有三条常见替代路线:

  1. 边界近似线性:用 LinearSVCSGDClassifier(loss='hinge')
  2. 仍需要 RBF 形状:用 Nyström 或随机傅里叶特征近似核,再接线性模型;
  3. 表格任务允许别的归纳偏置:比较直方图梯度提升等强基线。

Nyström 近似把隐式无限维核压成显式的 MM 维特征:

n_components 越大通常越接近原核,也增加变换、内存与线性模型成本;它与 gammaC 一样要在开发数据上验证。

10 常见错误与最短调试路径#

  1. 忘记标准化。 RBF 直接使用平方距离,一个大尺度特征会吞没其余维度;缩放必须只在训练折拟合。
  2. 只调 C,不调 gamma。 二者共同控制容量,应在对数网格联合搜索。
  3. 把 gamma 当影响半径。 gamma 越大,实际影响越窄;可先手算距离 1 时的 eγe^{-\gamma}
  4. 把 decision score 当概率。 分数可为任意实数;用校准器并验证 Brier 分数、对数损失和校准曲线。
  5. 对全数据先算 Gram 矩阵再交叉验证。 若核前还包含可学习预处理,会发生泄漏;优先使用 Pipeline。
  6. 自定义预计算核形状错误。 训练应为 [N_train,N_train],验证/推理应为 [N_query,N_train],第二维始终对应训练样本。
  7. 无限扩大 cache_size 或 n_jobs。 每个并发折都可能占用自己的核缓存,外层并行会放大内存。
  8. 支持向量比例接近 100% 仍忽略延迟。 先检查重叠、噪声、C/gamma 和线性/近似替代方案。
  9. 在训练范围外相信分数大小。 RBF 相似度远离所有支持向量会共同衰减,外推行为并不等同于置信度。

最小诊断代码:

assert X_train.ndim == 2 and y_train.ndim == 1
assert X_train.shape[0] == y_train.shape[0]
assert np.isfinite(X_train).all()
assert np.isfinite(score).all()
assert svc.support_vectors_.shape[1] == X_train.shape[1]
assert svc.dual_coef_.shape[1] == len(svc.support_)
print('classes:', svc.classes_)
print('support ratio:', len(svc.support_) / len(X_train))
python

若训练和验证都差,优先检查缩放、gamma 是否过小和特征是否有信号;若训练接近完美而验证差,优先减小 gamma、减小 C、排查泄漏和标签噪声。

11 与相近方法的边界#

方法非线性从哪里来训练/推理主要状态主要限制
RBF SVM支持向量与 RBF 核支持向量和对偶系数样本规模大时昂贵
KNN原始空间局部距离几乎全部训练样本高维距离退化、推理慢
核逻辑回归核特征 + 对数损失通常更稠密的系数优化和存储可能更重
决策树/提升树轴对齐分裂组合规则节点不做平滑外推
神经网络多层可学习表示网络参数训练设计与数据需求更复杂

RBF SVM 适合中小规模、经过良好缩放、边界非线性且局部平滑的数据。它不是所有非线性问题的默认答案:图像、文本、序列和图结构通常需要更合适的表示;高维稀疏文本常先比较线性 SVM;需要概率时要把校准成本纳入方案。

12 今天真正需要记住什么?#

  1. SVM 的对偶目标和预测只依赖样本点积,因此可以用核函数替换高维映射后的点积。
  2. 决策函数是支持向量核相似度的带符号加权和:αiyiK(xi,x)+b\sum\alpha_i y_iK(x_i,x)+b
  3. RBF 核按平方距离衰减;gamma 越大,单个样本影响越窄,边界容量通常越高。
  4. C 控制违规价格,gamma 控制局部影响范围,二者必须在无泄漏 Pipeline 中联合验证。
  5. 精确核 SVM 的训练至少二次扩展,支持向量过多还会拖慢推理;大数据要比较线性或核近似方案。

13 思考题与小练习#

练习 1:手算 RBF 核

x=[0,0]x=[0,0]z=[1,1]z=[1,1]γ=0.5\gamma=0.5。平方距离为 2,因此 K(x,z)=e10.368K(x,z)=e^{-1}\approx0.368。若先把第二维放大 100 倍,核几乎变为 0,这说明尺度为何会决定相似度。

练习 2:写出查询核矩阵形状

训练集有 800 个样本,测试批有 32 个样本。若 kernel='precomputed',训练 Gram 矩阵是 [800,800],测试核矩阵是 [32,800];测试矩阵不是 [32,32]

练习 3:做 C-gamma 二维消融

固定划分和缩放,对 C,gamma in {0.01,1,100} 的 9 个组合记录训练分数、验证分数、支持向量比例、训练时间和 P99 延迟。解释哪一角欠拟合,哪一角最可能追逐噪声。

相关工作#

14 下一篇预告#

SVM 从几何间隔出发,通过支持向量决定边界。下一篇将换到概率生成视角:朴素贝叶斯怎样用类别先验与条件似然组合证据,并用对数空间避免许多小概率相乘后下溢。

不显式增加维度,SVM 怎样画出弯曲边界?从核技巧到 RBF
https://zwjcode.cn/blog/svm-kernel-trick-rbf-gamma
作者
发布于 2026年8月24日
版权协议 CC BY-NC-SA 4.0
评论加载似乎遇到了问题,请尝试刷新页面。