📑 本页目录(点开跳转)
06 · 核技巧:不用算就能算
⏱ 24 分钟 | ⭐⭐⭐ 机器学习里最优雅的想法
🎯 一句话
想在高维空间里干活,但高维算不动(第 5 章)。 核技巧:不去那个高维空间,却拿到在那里计算的结果。
🧠 一、问题:线性不可分怎么办
一维数据,线性不可分:
○ ○ ○ ● ● ● ○ ○ ○ ← 一刀切不开(中间是●,两边是○)
────────────────► x
把它映射到二维:φ(x) = (x, x²)
●●●
x² ▲ ○ ○ ← 现在一条直线能切开了!✅
│ ○ ○
│ ● ● ●
└──────────────► x
💡 核心思想:在低维分不开的数据,映射到高维往往就分得开了。
这不是巧合——维度越高,"能把点分开的方式"就越多。 极端情况下,n 个点映射到 n−1 维后总是线性可分的。
但问题来了:
| 问题 | 说明 |
|---|---|
| 映射到几维? | 为了保险可能要几千维甚至无穷维 |
| 算不动 | 高维计算量爆炸(第 5 章) |
| 存不下 | 每个样本变成一个几千维的向量 |
⭐ 二、核技巧:那个漂亮的观察
关键发现:很多算法(感知机、SVM、PCA、岭回归、K-Means…) 只用到样本之间的内积 $x_i^\top x_j$,从不需要单个样本本身。
如果算法只需要 φ(xᵢ)·φ(xⱼ),
而我们能【直接算出这个内积】,不必先算出 φ(xᵢ) 和 φ(xⱼ)……
那我们就根本不需要去那个高维空间! ⭐
🔨 一个 30 秒能验证的例子
取二维输入 x = (x₁, x₂),定义映射到三维:
φ(x) = (x₁², √2·x₁x₂, x₂²)
算两个点在【三维空间】里的内积:
φ(a)·φ(b) = a₁²b₁² + 2a₁a₂b₁b₂ + a₂²b₂²
= (a₁b₁)² + 2(a₁b₁)(a₂b₂) + (a₂b₂)² ← 完全平方式!
= (a₁b₁ + a₂b₂)²
= (a·b)² ⭐⭐
↑ 只用【二维】的内积,平方一下就得到了
💡 人话:
在原空间算个内积,平方一下 —— 你就白拿到了三维空间里的内积。 从头到尾没有构造过任何三维向量。
$$K(a,b) = (a^\top b)^2 = \varphi(a)^\top\varphi(b)$$
这个函数 K 就叫「核函数」。
# 自己验证一下(10 秒)
import numpy as np
a, b = np.array([1., 2.]), np.array([3., 4.])
phi = lambda x: np.array([x[0]**2, np.sqrt(2)*x[0]*x[1], x[1]**2])
print(phi(a) @ phi(b)) # 显式映射到三维再点积
print((a @ b) ** 2) # 核技巧:二维点积后平方
# → 两个数完全相同 ✅
🎩 三、为什么这叫"魔法"
多项式核 K(a,b) = (a·b + c)^d
→ 对应的 φ 把 n 维映射到 C(n+d, d) 维
→ d=5, n=100 时是【近亿维】
→ 但你只需要:算一次点积,加个常数,取 5 次方 ✅
高斯核(RBF) K(a,b) = exp(−‖a−b‖²/2σ²)
→ 对应的 φ 是【无穷维】的! ⭐
→ 你永远算不出 φ(x),但 K(a,b) 一行就算完
📐 为什么 RBF 核是无穷维(想看再点)
把指数展开成泰勒级数:
$$e^{a^\top b} = \sum_{k=0}^{\infty}\frac{(a^\top b)^k}{k!}$$
每一项 $(a^\top b)^k$ 都对应一个 k 阶多项式核 —— 也就是一个有限维映射。 无穷多项加起来 = 无穷维的特征空间。
而 RBF 核 $\exp(-\gamma\|a-b\|^2) = e^{-\gamma\|a\|^2}e^{-\gamma\|b\|^2}e^{2\gamma a^\top b}$, 最后那项正是上面的形式。
🔑 核技巧的威力一句话: 你在一个自己永远无法写下来的空间里做线性分类,而计算成本只和原始维度有关。
📋 四、常用核函数
| 核 | 公式 | 特点 | 什么时候用 |
|---|---|---|---|
| 线性核 | $a^\top b$ | 就是不做映射 | 数据本身线性可分;高维稀疏(文本) |
| 多项式核 | $(a^\top b + c)^d$ | 捕捉 d 阶特征交互 | 知道存在特定阶的交互 |
| 高斯核 / RBF ⭐ | $\exp(-\gamma\|a-b\|^2)$ | 无穷维,极其灵活 | 默认首选 |
| Sigmoid 核 | $\tanh(\kappa a^\top b + c)$ | 类似两层神经网络 | 少用(不总满足 Mercer 条件) |
🎚️ RBF 核的 γ 到底在控制什么
K(a,b) = exp(−γ‖a−b‖²)
γ = 0.01 → 距离要很远相似度才降下来
每个点影响一大片 → 边界平滑 → 【欠拟合】
γ = 100 → 稍微远一点相似度就掉到 0
每个点只影响身边一丁点 → 边界极其扭曲 → 【过拟合】
(极端情况:退化成"只有自己和自己相似" = 记住训练集)
⭐ γ 是偏差-方差旋钮,和第 4 章 kNN 的带宽 h 是同一个东西的两种写法。
💡 一个漂亮的连接:RBF 核
exp(−γ‖a−b‖²)和第 4 章 kNN 的高斯加权完全一致。 「离得近的样本更重要」这个朴素想法,一路长成了核方法。
实用起点:gamma="scale"(sklearn 默认,按特征方差自适应),然后在 [0.001, 0.01, 0.1, 1] 附近扫。
✅ 五、什么函数才能当核(Mercer 条件)
不是随便一个二元函数都能当核。必须存在某个 φ 使得 K(a,b) = φ(a)·φ(b)。
判据(Mercer 定理):K 是合法核 ⟺ 对任意样本集,核矩阵(Gram 矩阵)半正定。
$$\mathbf{K} = \begin{pmatrix} K(x_1,x_1) & \cdots & K(x_1,x_n)\\ \vdots & & \vdots \\ K(x_n,x_1) & \cdots & K(x_n,x_n)\end{pmatrix} \succeq 0$$
💡 人话:核矩阵必须是一个"合法的相似度矩阵"—— 半正定保证了不会出现「某个样本和自己的相似度是负的」这类荒谬情况。
实用规则(不用记定理)
✅ 常用核(线性/多项式/RBF)都是合法的,直接用
✅ 核的【组合】仍是核,可以放心造新核:
K₁ + K₂ (和)
c·K (c > 0) (正数倍)
K₁ · K₂ (乘积)
f(x)·K·f(y) (函数缩放)
⚠️ 只有自己发明核函数时,才需要验证半正定
一个实用场景:多模态数据可以分别用不同的核再相加——
比如 K_文本 + K_图像,这仍是合法核。
⚠️ 六、代价:核矩阵是 n×n 的
核方法的计算量和【样本数 n】有关,而不是维度 d
—— 这正好和你的直觉相反!
n = 1 万 → 核矩阵 10⁸ 个数 ≈ 800 MB 还行
n = 10 万 → 10¹⁰ 个数 ≈ 80 GB 💀 存不下
n = 100 万 → 10¹² 个数 💀💀
训练复杂度:O(n²) ~ O(n³)
预测复杂度:O(n_sv × d) ← 要和每个支持向量算核
⭐ 这就是核方法在大数据时代输给深度学习的根本原因: 它的复杂度随样本数超线性增长,无法 scale。
🔗 对比基础教程第 14 章的教训: Transformer 赢在能并行、能 scale。 核方法优雅但不 scale——这在深度学习时代是致命的。 又一次印证:可扩展性胜过精巧的结构设计。
缓解手段(了解即可):Nyström 近似、随机傅里叶特征(把核近似成有限维显式特征)。
🔗 七、和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 4 章 kNN 的高斯加权 | 就是 RBF 核 |
| 第 5 章维度灾难 | 核技巧是绕过它的一条路(不真去高维) |
| 第 7 章 SVM 的对偶形式 | 对偶让核技巧能用上(下一章) |
| 推荐算法的相似度矩阵 | 就是一个核矩阵(如果它半正定的话) |
| 基础教程:Transformer 赢在可扩展 | 核方法输在 O(n²) |
✅ 检查点
- 核技巧解决什么问题?它的关键前提是什么?
- 为什么
(a·b)²等于三维空间里的内积?(能推一遍吗) - RBF 核对应多少维的映射?γ 大和小分别导致什么?
- Mercer 条件的实用含义是什么?怎么造新核?
- 核方法的复杂度和什么有关?为什么这和直觉相反?
- 为什么说核方法"优雅但输了"?
👀 答案
- 解决"想用高维空间的表达力但算不动"的问题。关键前提:算法只用到样本间的内积,从不需要单个样本本身。
- 展开 φ(a)·φ(b) = a₁²b₁² + 2a₁a₂b₁b₂ + a₂²b₂²,这是完全平方式 (a₁b₁+a₂b₂)²,也就是 (a·b)²。所以原空间算内积再平方,就白拿到了高维内积。
- 无穷维(指数的泰勒展开对应无穷多个多项式核)。γ 大 → 只有极近的点相似 → 边界扭曲 → 过拟合;γ 小 → 远处也算相似 → 边界平滑 → 欠拟合。
- 核矩阵必须半正定(合法的相似度矩阵)。造新核:核的和、正数倍、乘积仍是核,所以可以
K_文本 + K_图像这样组合。 - 和样本数 n 有关(核矩阵 n×n),不是维度 d。这和直觉相反——直觉以为高维更难,但核技巧恰恰把维度问题消掉了,代价转移到了样本数上。
- 它用一个极其优雅的数学技巧绕过了维度灾难,但复杂度 O(n²~n³) 使它无法处理大数据。可扩展性胜过精巧设计。
🛑 可以停在这里
⚡ 走神救援
核技巧 = 不去那个高维空间,却拿到在那里计算的结果。低维分不开的数据映射到高维往往就分得开(n 个点映射到 n−1 维后总是线性可分),但高维算不动、存不下。⭐关键观察:SVM、PCA、岭回归、感知机只用到样本间的内积,不需要单个样本本身——只要能直接算出高维内积,就不必去那个空间。例子:φ(x) = (x₁², √2·x₁x₂, x₂²) 时 φ(a)·φ(b) 恰好是个完全平方式,等于 (a·b)²——在原空间算个内积、平方一下,就白拿到三维内积,全程没构造过任何三维向量。威力:多项式核 (a·b + c)^d 在 d=5、n=100 时对应近亿维映射,你只需算一次点积、加常数、取 5 次方;RBF 核 exp(−γ‖a−b‖²) 更是对应无穷维(泰勒展开 = 无穷多个多项式核叠加),你永远算不出 φ(x),但 K(a,b) 一行算完。⭐你在一个自己永远无法写下来的空间里做线性分类,而计算成本只和原始维度有关。RBF 是默认首选。γ 是偏差-方差旋钮:γ 小则每点影响一大片、边界平滑 → 欠拟合;γ 大则只影响身边一点 → 过拟合(极端时退化成「只和自己相似」= 记住训练集)。💡RBF 核就是第 4 章 kNN 的高斯加权,γ 和带宽 h 是同一个东西。合法性看 Mercer 条件:核矩阵必须半正定;核的和、正数倍、乘积仍是核,多模态可放心写
K_文本 + K_图像。⚠️代价:核矩阵是 n×n 的——n=1 万约 800 MB,n=10 万就是 80 GB,存不下;训练复杂度 O(n²)~O(n³)。⭐复杂度取决于样本数 n 而不是维度 d,正好和直觉相反;这也是核方法输给深度学习的根本原因——优雅但无法 scale,可扩展性胜过精巧的结构设计。缓解:Nyström 近似、随机傅里叶特征。
下一节 👉 07-SVM.md