Skip to content

Vector Properties(向量属性)

Vector properties 描述了 vector 的几何与代数特征,刻画 vector 的行为方式。本节涵盖 magnitude(模)、direction(方向)、unit vector(单位向量)、等价性、平行性、正交性以及线性无关性——这些是构成每个 ML feature space 的基础。

  • Magnitude(或 length)告诉你一个 vector 能"延伸多远"。可以把它想成箭头的长度。对于 vector \(\mathbf{a} = (a_1, a_2, a_3)\),其 magnitude 为:
\[\|\mathbf{a}\| = \sqrt{a_1^2 + a_2^2 + a_3^2}\]
  • 这正是推广到高维的勾股定理,它度量的是从原点到该点的直线距离。

  • Vector 的 direction 告诉你它指向哪里;直觉上,就是从原点到坐标点连成的一条直线。

  • 当原点未明确指定时,我们通常默认原点为 \((0,0,\ldots,0)\),至少在可视化时是如此。

  • 位置并不重要,重要的始终是位移:从原点出发的 \((3, 2)\) 与从其他点出发的 \((3, 2)\) 仍然是同一个 vector。

Vector 相等性:从两个不同起点画出的相同 (3,2) 向量

  • 两个 vector 可以具有相同的长度但指向完全不同的方向,也可以指向相同方向但长度不同。

相同 direction、不同 magnitude(v 和 2v)与相同 magnitude、不同 direction 的对比

  • 当且仅当两个 vector 的所有对应分量都相等时,它们才相等;相同的长度,相同的方向,完全一样的箭头。
\[\mathbf{a} = \mathbf{b} \iff a_i = b_i \text{ 对所有 } i \text{ 成立}\]
  • 如果一个 vector 是另一个 vector 的 scalar 倍,则这两个 vector 平行。它们沿同一条直线排列,方向相同或完全相反。
\[\mathbf{a} \parallel \mathbf{b} \iff \mathbf{a} = k\mathbf{b} \text{ 对某个 scalar } k \neq 0 \text{ 成立}\]

平行 vector:a 和 b 同向,a 和 -b 反向

  • \(k > 0\),它们方向相同;若 \(k < 0\),它们方向相反。无论哪种情况,它们都位于过原点的同一条直线上。

  • 直觉上,平行 vector 不携带任何"新"的方向信息。一个不过是另一个的拉伸或翻转版本。

  • 如果两个 vector 指向完全独立的方向,则称它们正交(垂直)。沿一个方向移动对另一个方向毫无贡献。

正交 vector:u 和 v 成直角

  • 想象向北走然后向东走——这两个方向是正交的,无论向北走多远都不会让你向东移动。我们会非常频繁地遇到正交性。

  • 正交性在 ML 中非常核心:正交的 feature 携带完全独立的信息,这是理想的表示方式。

  • 更一般地,任意两个 vector 之间都有一个夹角 \(\theta\),范围从 \(0°\)\(180°\)

  • 这个角度完整刻画了两个方向之间的关系:\(0°\) 表示平行(同向),\(180°\) 表示平行(反向),\(90°\) 表示正交。介于两者之间的是某种混合状态。

  • ML 中大多数 vector 关系都处于这个谱系中的某处。之后我们将学习精确的工具(dot product、cosine similarity)来计算这个角度。

  • 如果一组 vector 中至少有一个可以由其他 vector 通过缩放和相加来构成,则称它们线性相关。该 vector 没有带来任何新信息。

  • 例如,若 \(\mathbf{c} = 2\mathbf{a} + 3\mathbf{b}\),则 \(\mathbf{c}\) 是冗余的——你已经通过 \(\mathbf{a}\)\(\mathbf{b}\) 拥有了 \(\mathbf{c}\) 提供的一切信息。

  • 平行 vector 始终线性相关,因为一个不过是另一个的缩放副本。任何包含零 vector 的集合也是线性相关的。

  • 如果没有任何一个 vector 能由其他 vector 构成,则称这些 vector 线性无关。每个 vector 都贡献了一个全新的方向。正交 vector 始终线性无关。

  • 在二维中,两个线性无关的 vector 可以到达平面上的任意一点;在三维中,你需要三个。"需要多少个独立 vector"这一概念与维度直接相关。

  • 当一个 vector 的大多数分量为零时,称其为稀疏(sparse)的;反之,大多数分量非零,则称其为稠密(dense)的。

\[\mathbf{s} = [0, 0, 3, 0, 0, 0, 1, 0, 0, 0]\]
  • 稀疏性很重要,因为它影响存储和计算效率。稀疏 vector 只需追踪非零项,因此存储和处理都更高效。

  • Unit vector 是 magnitude 恰好为 1 的 vector。它纯粹代表一个方向,不携带任何长度信息。你可以将任意 vector 除以其 magnitude 来得到 unit vector:

\[\hat{\mathbf{a}} = \frac{\mathbf{a}}{\|\mathbf{a}\|}\]
  • 这个过程称为归一化(normalisation)。它去掉了"走多远"的信息,只保留"往哪走"。

  • 标准 unit vector 沿每条坐标轴指向:\(\hat{\mathbf{i}} = (1, 0, 0)\)\(\hat{\mathbf{j}} = (0, 1, 0)\)\(\hat{\mathbf{k}} = (0, 0, 1)\)。任何 vector 都可以写成这些 unit vector 的组合,例如 \((3, 2, 4) = 3\hat{\mathbf{i}} + 2\hat{\mathbf{j}} + 4\hat{\mathbf{k}}\)

编程练习(使用 CoLab 或 notebook)

  1. 计算一个 vector 的 magnitude 并验证它与勾股定理一致,然后修改代码计算 unit vector。

    import jax.numpy as jnp
    
    a = jnp.array([3.0, 4.0])
    
    magnitude = jnp.sqrt(jnp.sum(a ** 2))
    print(f"a 的 magnitude: {magnitude}") 
    

  2. 通过检验一个 vector 是否是另一个 vector 的 scalar 倍来判断两者是否平行。

    import jax.numpy as jnp
    
    a = jnp.array([2, 4, 6])
    b = jnp.array([1, 2, 3])
    
    ratios = a / b
    print(f"比值: {ratios}")
    print(f"平行: {jnp.allclose(ratios, ratios[0])}")