Files
maths-cs-ai-compendium-zh/chapter 01: vectors/03. norms and metrics.md
T
flykhan 2536c937e3 feat: 完整中文翻译 maths-cs-ai-compendium(数学·计算机科学·AI 知识大全)
翻译自英文原版 maths-cs-ai-compendium,共 20 章全部完成。

第01章 向量 | 第02章 矩阵 | 第03章 微积分
第04章 统计学 | 第05章 概率论 | 第06章 机器学习
第07章 计算语言学 | 第08章 计算机视觉 | 第09章 音频与语音
第10章 多模态学习 | 第11章 自主系统 | 第12章 图神经网络
第13章 计算与操作系统 | 第14章 数据结构与算法
第15章 生产级软件工程 | 第16章 SIMD与GPU编程
第17章 AI推理 | 第18章 ML系统设计
第19章 应用人工智能 | 第20章 前沿人工智能

翻译说明:
- 所有数学公式 $...$ / $$...$$、代码块、图片引用完整保留
- mkdocs.yml 配置中文导航 + language: zh
- README.md 已翻译为中文(兼 docs/index.md)
- docs/ 目录包含指向各章文件的 symlink
- 约 29,000 行中文内容,排除 .cache/ 构建缓存
2026-05-03 10:23:20 +08:00

91 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 度量与范数
*范数衡量单个向量的大小;度量衡量两个向量之间的距离。本文涵盖 L1、L2 和 L-无穷范数、欧几里得距离和余弦距离,以及为什么为 kNN、聚类和 ML 中的检索选择合适的距离函数至关重要。*
- 我们知道向量有模长和方向。但我们如何实际衡量单个向量"有多大",或者两个向量"有多远"?这就是**范数**和**度量**发挥作用的地方。
- 对标量而言,我们知道 10 > 5,因为它们的值对它们进行了量化,但是我们如何量化一个向量?它的**范数**衡量单个向量的大小。
- 最熟悉的范数是**欧几里得范数**(L2),它就是我们已知的模长公式:
$$\|\mathbf{v}\|_2 = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2}$$
- 但还有其他衡量大小的方法。想象你在一个街道呈网格状的城市中。你不能斜穿建筑物,所以你旅程的"长度"是沿着每条街道行走的总街区数。这就是**曼哈顿范数**(L1):
$$\|\mathbf{v}\|_1 = |v_1| + |v_2| + \cdots + |v_n|$$
- 或者你可能只关心单个最大的分量,忽略其余部分。这就是**最大范数**(L-无穷):
$$\|\mathbf{v}\|_\infty = \max(|v_1|, |v_2|, \ldots, |v_n|)$$
- 这三个都是**一般 Lp 范数**的特例:
$$\|\mathbf{v}\|_p = (|v_1|^p + |v_2|^p + \cdots + |v_n|^p)^{1/p}$$
- 设置 $p = 2$ 得到欧几里得,$p = 1$ 得到曼哈顿,而当 $p \to \infty$ 时得到最大范数。随着 $p$ 增大,最大分量贡献越来越大,直到最终只有它重要。
- 每个范数必须遵守三条规则:
- **非负性**$\|\mathbf{v}\| \geq 0$,且 $\|\mathbf{v}\| = 0$ 仅当 $\mathbf{v} = \mathbf{0}$。大小从不为负,只有零向量的大小为零。
- **缩放性**$\|c\mathbf{v}\| = |c| \cdot \|\mathbf{v}\|$。将向量加倍,其大小也加倍。
- **三角不等式**$\|\mathbf{u} + \mathbf{v}\| \leq \|\mathbf{u}\| + \|\mathbf{v}\|$。捷径永远不会比绕远路更长。
- 现在,**度量**衡量*两个*向量之间的距离。把它想象成问:"这两个点相距多远?"
- 获得度量的最简单方法是使用差值的范数:$d(\mathbf{u}, \mathbf{v}) = \|\mathbf{u} - \mathbf{v}\|$。减去两个向量,然后测量剩余部分的大小。
- 使用欧几里得范数,我们得到熟悉的**欧几里得距离**:
$$d(\mathbf{u}, \mathbf{v}) = \sqrt{(u_1 - v_1)^2 + (u_2 - v_2)^2 + \cdots + (u_n - v_n)^2}$$
- 使用曼哈顿范数得到**曼哈顿距离**,沿着每个轴的总差异,就像计算两个位置之间的城市街区数。
- 每个度量必须遵守四条规则:
- **非负性**$d(\mathbf{u}, \mathbf{v}) \geq 0$。距离从不为负。
- **同一性**$d(\mathbf{u}, \mathbf{v}) = 0$ 当且仅当 $\mathbf{u} = \mathbf{v}$。零距离意味着同一点。
- **对称性**$d(\mathbf{u}, \mathbf{v}) = d(\mathbf{v}, \mathbf{u})$。从 A 到 B 的距离与从 B 到 A 的距离相同。
- **三角不等式**$d(\mathbf{u}, \mathbf{w}) \leq d(\mathbf{u}, \mathbf{v}) + d(\mathbf{v}, \mathbf{w})$。直接走永远不会比绕路更长。
- 那么两者之间的关系是什么?范数衡量一个向量,度量衡量两个向量之间的差距。每个范数自然地创建一个度量(通过测量差值),但并非每个度量都来自范数。
- 例如,**汉明距离**计算两个向量不同的位置数量。它是一个有效的度量,但并非来自任何范数。
- 在 ML 中,选择合适的范数或度量很重要。
- L2 距离在求和前对每个差值平方,因此单个大的差值会主导结果。
- L1 距离对绝对差值求和,平等对待每个差值。与 L2 相比,单个大的差值影响较小。
## 编程练习(使用 CoLab 或 notebook
1. 计算同一向量的 L1 和 L2 范数。尝试更改值,注意哪个范数对大的分量最敏感,哪个对许多小分量最敏感。然后尝试计算 p 值递增(例如 1、2、5、10、50、100)时的 Lp 范数,观察它如何收敛到 L-无穷值。
```python
import jax.numpy as jnp
v = jnp.array([3.0, -4.0, 1.0])
l1 = jnp.sum(jnp.abs(v))
l2 = jnp.sqrt(jnp.sum(v ** 2))
print(f"L1: {l1}, L2: {l2:.2f}")
```
2. 计算两个向量之间的欧几里得距离和曼哈顿距离。尝试让向量彼此靠近或远离,观察每种距离如何不同地响应。
```python
import jax.numpy as jnp
u = jnp.array([1.0, 2.0, 3.0])
v = jnp.array([4.0, 0.0, 1.0])
euclidean = jnp.sqrt(jnp.sum((u - v) ** 2))
manhattan = jnp.sum(jnp.abs(u - v))
print(f"Euclidean: {euclidean:.2f}, Manhattan: {manhattan}")
```