Files
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

7.2 KiB
Raw Permalink Blame History

向量空间

向量空间构成了机器学习的数学舞台。本文涵盖向量加法、标量乘法、封闭性公理、子空间,以及为什么AI中几乎所有东西都表示为向量。

  • 将向量空间想象成一种特定类型的舞台,数学对象生活在其中,每个对象被称为一个向量

  • 为了机器学习(ML)中的几何直觉,我们始终将向量视为欧几里得空间中的一个点,由其坐标表示。

  • 向量 $\mathbf{a}$(数学上用粗体小写字母表示)有 n 个坐标,每个坐标代表沿一个轴的位置。

\mathbf{a} = [a_1, a_2, a_3]

向量 a = (3, 2, 4) 在三维空间中沿 x、y、z 轴绘制

  • 向量空间中的向量遵循一套非常具体、不可打破的规则:

    • 向量加法(组合): 你可以取任意两个向量并将它们组合起来创建新向量。 把向量想象成移动的指令。 如果向量 A 表示"向前走 3 步",向量 B 表示"向右走 2 步", 将它们相加(A + B)就创建了一条新的单一指令:"向前走 3 步并向右走 2 步。"

    • 标量乘法(缩放): 你可以使用一个普通数字("标量")来缩放任意向量。 你可以拉伸它、缩小它或反转它。 如果向量 A 是"向前走 3 步",将其乘以 2 就变成"向前走 6 步。" 将其乘以 -1 则完全翻转成"向后走 3 步。"

  • 向量空间的维度是其包含的独立方向的数量。\mathbb{R}^2 是二维的(需要 2 个坐标),而上面的 \mathbf{a} 存在于 \mathbb{R}^3 中。

  • 例如,我们可以将任何对象(比如一个人)表示为一个向量,其中 h_1 = 身高(厘米),h_2 = 体重(公斤),h_3 = 年龄。

\mathbf{h} = [185, 75, 30]
  • 我们现在已经创建了一个包含表示人的向量的向量空间。

  • 我们可以表示多个人,并观察他们之间的远近!

将三个人表示为向量:Alice 和 Carol 很近,Alice 和 Bob 很远

  • 我们可以添加更多特征,创建丰富的人体表示,在 ML 中通常称为特征向量。

  • 你拥有的独特且有意义的特征越多,特征向量的描述性就越强,这是需要记住的一个重要因素。

  • 超过 3 维后,向量变得非常难以直观检查,这催生了一个名为线性代数的数学领域。

  • 现在,线性代数是研究向量、向量空间以及向量之间映射关系的学科。

  • 我们在 AI/ML 中将几乎所有东西都表示为向量,这使得线性代数成为该领域的基石。

  • 向量加法可以通过将一个向量放在另一个向量的尾部,然后从原点画到终点的可视化方式执行。

向量加法:a(红色)加 b(蓝色)得到结果 a + b(绿色虚线)

  • 对于两个向量 \mathbf{a} = (a_1, a_2) 和 $\mathbf{b} = (b_1, b_2)$\mathbf{a} + \mathbf{b} = (a_1 + b_1, a_2 + b_2)

  • 向量也可以相减,所有加法规则同样适用。

  • 将向量乘以标量会在相同方向上按该因子缩放向量。

标量乘法:v(红色)、2v(蓝色,加倍)、-v(紫色,反向)

  • 对于标量 c 和向量 $\mathbf{v} = (v_1, v_2)$c\mathbf{v} = (cv_1, cv_2)

  • 加法封闭性:如果将向量空间中的任意两个向量相加,结果也属于同一空间:如果 \mathbf{u} \in V 且 $\mathbf{v} \in V$,则 \mathbf{u} + \mathbf{v} \in V

  • 标量乘法封闭性:如果将向量空间中的任意向量乘以标量,结果也属于同一空间:如果 \mathbf{v} \in V 且 $c \in F$,则 c\mathbf{v} \in V

  • 加法结合律:对于任意三个向量 $\mathbf{u}$、\mathbf{v} 和 $\mathbf{w}$(\mathbf{u} + \mathbf{v}) + \mathbf{w} = \mathbf{u} + (\mathbf{v} + \mathbf{w})

  • 加法交换律:对于任意两个向量 \mathbf{u} 和 $\mathbf{v}$\mathbf{u} + \mathbf{v} = \mathbf{v} + \mathbf{u}

平行四边形法则:两条路径(先 u 后 v,或先 v 后 u)到达同一点

  • 通过平行四边形的两条路径都到达同一点。

  • (零向量):存在一个向量 $\mathbf{0}$,使得对于任何向量 $\mathbf{v}$\mathbf{v} + \mathbf{0} = \mathbf{v}

零向量:v + 0 = v

  • 加法逆元:对于每个向量 $\mathbf{v}$,存在一个向量 $-\mathbf{v}$,使得:\mathbf{v} + (-\mathbf{v}) = \mathbf{0}

加法逆元:v(红色)和 -v(蓝色)抵消为零

  • 分配律 1:对于任意标量 c 和向量 $\mathbf{u}$、$\mathbf{v}$c(\mathbf{u} + \mathbf{v}) = c\mathbf{u} + c\mathbf{v}

分配律:缩放和(金色)等于缩放后的向量之和

  • 缩放和(金色)与分别缩放向量再求和的结果相同。

  • 分配律 2:对于任意标量 $c$、d 和向量 $\mathbf{v}$(c + d)\mathbf{v} = c\mathbf{v} + d\mathbf{v}

  • 结合律:对于任意标量 $c$、d 和向量 $\mathbf{v}$(cd)\mathbf{v} = c(d\mathbf{v})

  • 单位元:对于任何向量 $\mathbf{v}$$1\mathbf{v} = \mathbf{v}$,其中 1 是标量域中的乘法单位元。

  • 子空间就是大空间内部的一个较小舞台。把三维空间想象成一个房间。一张穿过房间中心的平坦纸片就是一个子空间,穿过中心的一根直导线也是子空间。

  • 关键要求是子空间必须经过原点。如果你把那片纸移开中心,它就不再是子空间了,因为零向量不再位于其上。

子空间:经过原点的直线和平面在三维空间内部

  • 向量空间的所有规则(加法、缩放、封闭性)在子空间内部仍然有效。你可以在子空间内添加或缩放向量,永远不会"掉出"到更大的空间。

  • 经过原点的直线是一维子空间,经过原点的平面是二维子空间,而整个空间是自身的子空间。

  • 在 ML 中,子空间自然出现。高维数据通常具有存在于低维子空间上的结构。PCA 等技术找到那个子空间,这样我们可以更高效地处理数据。

编程练习(使用 CoLab 或 notebook

  1. 运行代码验证分配律性质,然后修改并尝试测试其他规则!
import jax.numpy as jnp

u = jnp.array([1, 2])
v = jnp.array([3, 0])
c = 2

lhs = c * (u + v)
rhs = c*u + c*v

print(f"LHS: {lhs}")
print(f"RHS: {rhs}")
  1. 运行代码可视化不同的向量,然后修改不同坐标的值以理解每个轴如何影响位置。
import jax.numpy as jnp
import matplotlib.pyplot as plt

# 尝试修改这些向量!
a = jnp.array([3, 2, 4])
b = jnp.array([1, 4, 2])
c = jnp.array([4, 1, 3])

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

for vec, name, color in [(a, "a", "red"), (b, "b", "blue"), (c, "c", "green")]:
    ax.quiver(0, 0, 0, *vec, color=color, arrow_length_ratio=0.1, linewidth=2, label=name)

lim = int(jnp.abs(jnp.stack([a, b, c])).max()) + 1
ax.set_xlim([0, lim]); ax.set_ylim([0, lim]); ax.set_zlim([0, lim])
ax.set_xlabel("X"); ax.set_ylabel("Y"); ax.set_zlabel("Z")
ax.legend()
plt.show()