📑 本页目录(点开跳转)
05 · 维度灾难
⏱ 28 分钟 | ⭐⭐ 用数字就能吓到你的一章
🎯 一句话
高维空间的几何和你的直觉完全相反。 在 500 维里,「最近的邻居」和「最远的邻居」几乎一样远—— 基于距离的方法在那里全线失效。
😱 一、四个数字实验(全部实测)
实验 1:球在立方体里几乎不占地方
单位立方体里塞一个内切球,球占多少体积?
| 维度 d | 球 / 立方体 | 直觉检验 |
|---|---|---|
| 2 | 78.5% | 圆占正方形——符合直觉 |
| 3 | 52.4% | 球占正方体——还行 |
| 5 | 16.5% | 已经开始不对劲 |
| 10 | 0.25% | 💀 |
| 20 | 0.0000025% | 💀💀 |
| 50 | 1.5 × 10⁻²⁶ % | 💀💀💀 |
💡 这意味着什么: 高维立方体的体积几乎全在角落里。 中间那个"球"——也就是你直觉中的"中心区域"——空得可怕。
为什么:d 维立方体有 2ᵈ 个角。d=100 时是 10³⁰ 个角。 体积全被这些角瓜分了。
实验 2:数据全都在"壳"上
单位球里,最外面 5% 厚度的那层壳,占多少体积?
| 维度 d | 外壳占比 |
|---|---|
| 1 | 5.0% |
| 3 | 14.3% |
| 10 | 40.1% |
| 50 | 92.3% |
| 100 | 99.4% |
💡 人话:100 维空间里,99.4% 的点都挤在最外面那层薄壳上。
因果链
🔗 这个结论对异常检测是致命的: 「离中心远 = 异常」这条规则在高维失效,因为所有点都离中心很远。
实验 3:⭐ 最要命的一个 —— 距离失去意义
1000 个随机点,看「最远距离」和「最近距离」差多少:
$$\frac{d_{max} - d_{min}}{d_{min}}$$
| 维度 d | 相对差距 |
|---|---|
| 2 | 280.0 |
| 5 | 7.40 |
| 10 | 2.41 |
| 50 | 0.89 |
| 100 | 0.41 |
| 500 | 0.19 |
💡 这就是 kNN 在高维死掉的原因:
500 维时,最远的点只比最近的点远 19%。 「最近邻」这个概念在数值上已经没有区分度了——所有点都差不多远。
而 kNN、K-Means、DBSCAN、余弦相似度检索、异常检测…… 全都建立在"距离有意义"这个前提上。
# 你可以自己跑一遍(30 秒)
import numpy as np
rng = np.random.RandomState(0)
for d in [2, 10, 100, 500]:
X = rng.rand(1000, d); q = rng.rand(1, d)
dist = np.linalg.norm(X - q, axis=1)
print(f"d={d:<5} 相对差距 = {(dist.max()-dist.min())/dist.min():.2f}")
实验 4:样本需求指数爆炸
想让每个维度上都有 10 个采样点(覆盖住空间):
| 维度 d | 需要的样本数 | 参照 |
|---|---|---|
| 1 | 10 | — |
| 3 | 1,000 | — |
| 5 | 100,000 | — |
| 10 | 10¹⁰ | 100 亿,接近全球人口 ×1.2 |
| 20 | 10²⁰ | 比地球上的沙子还多 |
💡 这解释了为什么高维一定过拟合: 你永远不可能有足够的数据填满高维空间。 无论你有多少数据,在高维里它都只是"稀疏的几个孤点"。
🧠 二、为什么会这样:一个统一的直觉
关键信息
所以随机点几乎必然落在某个角落/表面。 上面四个实验都是这一条的不同表现。
💥 三、它毁掉了什么
| 受害者 | 怎么死的 |
|---|---|
| kNN / 核方法 ⭐ | 距离失去区分度(实验 3) |
| K-Means / DBSCAN | 同上——聚类基于距离 |
| 异常检测 | 「离中心远=异常」失效(实验 2:所有点都远) |
| 核密度估计 | 需要的样本量指数爆炸(实验 4) |
| 任何"局部"方法 | 高维里根本没有"局部"这回事 |
| 可视化直觉 ⭐ | 你在 2D/3D 里的所有几何直觉都会骗你 |
⚠️ 一个常见的自欺: 在 2 维画个图,看到聚类效果不错,就以为 200 维也会这样。 不会。 你的图和真实的高维结构没什么关系(这也是基础教程第 6 章 说「t-SNE 的图只能用来看一眼」的深层原因)。
🛡️ 四、怎么活下来(五条出路)
① 降维
PCA / 特征选择 / 自编码器 —— 直接把 d 降下来。
② 特征选择
大多数维度是噪声,删掉它们比压缩更好。 高维里"噪声维度"的害处是双重的:既增加维度,又稀释真实信号。
③ ⭐ 加强的归纳偏置(最重要的一条)
关键信息
🔗 基础教程第 12 章。 归纳偏置的本质,就是用"关于数据的假设"来对抗维度灾难。
④ 正则化 / 先验
用先验信念约束住高维空间里的自由度。
⑤ ⭐ 流形假设(最深刻的一条)
关键信息
高维空间 真实数据所在的流形
🔑 这个假设是整个表示学习 / Embedding 的理论基础: - 推荐算法把 1 亿维 one-hot 压成 64 维 Embedding —— 找那个流形 - 深度学习的每一层都在做"把数据往更好的流形坐标系上摆"
深度学习能在高维数据上工作,正是因为它学的是那个低维流形,不是整个高维空间。
🔬 五、一个实用的诊断
怎么判断你的问题是否受维度灾难影响:
流程图
💡 为什么树模型受影响小:它每次只看一个特征做切分, 不计算全维度的距离——天然绕过了维度灾难的核心机制。 这也是ML 基础 04a · 集成学习与 GBDT说 "表格数据上树模型很难被打败"的深层原因之一。
🔗 六、和站内其他章的关系
| 相关的地方 | 根因在这 |
|---|---|
| 推荐算法:交互矩阵 99.99% 是空的 | 维度灾难在推荐场景的形态 |
| 推荐算法:为什么要用 Embedding 降维 | 流形假设 |
| 基础教程第 6 章:PCA 的意义 | 出路 ① |
| 基础教程第 6 章:t-SNE 的图不可信 | 高维几何直觉失效 |
| 基础教程第 12 章:CNN 为什么有效 | 出路 ③——归纳偏置降低有效维度 |
| 基础教程第 4 章:树模型在表格数据上强 | 它不算全维度距离 |
| 基础教程第 14 章:归纳偏置 vs 数据量 | 同一个权衡的另一面 |
✅ 检查点
- 100 维单位球里,99.4% 的体积在哪?这对异常检测意味着什么?
- 500 维时最近邻和最远邻差多少?这毁掉了哪些方法?
- 为什么高维必然过拟合?(用实验 4 解释)
- 用一句话解释所有四个实验的统一原因。
- 五条出路是什么?哪条最重要?
- 流形假设说了什么?它解释了什么现象?
- 为什么树模型受维度灾难影响较小?
👀 答案
- 在最外面 5% 厚度的薄壳上。高维空间里"没有中心",所以「离中心远=异常」这条异常检测规则失效——所有点都离中心很远。
- 只差 19%。毁掉了所有基于距离的方法:kNN、K-Means、DBSCAN、核方法、相似度检索、异常检测。
- 要覆盖 d 维空间需要 10^d 个样本,d=20 就需要 10²⁰ 个(比沙子还多)。你永远不可能有足够数据填满高维空间,数据在高维里永远是稀疏孤点。
- 「靠近中心」需要每个坐标都靠近(概率 p^d 指数衰减),「远离中心」只需任一坐标偏远(有 d 个机会,指数增长)。
- 降维、特征选择、加强归纳偏置(最重要)、正则化/先验、流形假设。归纳偏置最重要——CNN 靠它处理 15 万维图像。
- 真实数据虽名义上高维,但实际分布在一个低维弯曲子空间(流形)上。它解释了深度学习为什么能处理高维数据、Embedding 为什么有效。
- 树模型每次只看一个特征做切分,不计算全维度距离,天然绕过了维度灾难的核心机制。
🛑 可以停在这里
⚡ 走神救援
先记住这几件事
- 高维空间会改变体积、距离和邻域的直觉,低维图不能直接代替高维判断。
- 距离逐渐缺少区分度时,依赖局部邻居的方法会变得困难。
- 通过特征选择、表示学习和匹配任务的归纳偏置降低有效复杂度,再用验证结果判断。
下一节 👉 05b-PCA的推导.md