跳到内容

第 10 卷 / 第 10 章 / 第 1 课

10.1 向量与内积:把对象变成可比较的坐标 ​

本课目标 ​

完成本课后,你应该能够:

  • 区分向量的代数、几何和数据含义;
  • 使用范数、距离、点积和余弦相似度;
  • 判断两个向量能否直接比较;
  • 解释为什么特征缩放会改变距离模型的结果。

1. 坐标不是对象本身 ​

本课讨论有限维实向量,用一组有序实数作为坐标:

x=(x1,x2,…,xn)T.

同一形式可以承担三种角色:

  • 几何中的点或位移;
  • 系统状态,例如 [CPU 使用率, 内存占用, 请求延迟];
  • 特征表示,例如一部电影在“动作、喜剧、悬疑”三个维度上的权重。

向量只有连同坐标含义才有意义。[0.8, 0.1, 0.6] 本身不能说明什么;只有知道三个分量的顺序、单位和编码方法,比较才成立。把年龄、收入和点击次数直接放进同一个距离公式,数值范围最大的特征往往会主导结果。距离公式会照单计算,它可不知道“元”和“岁”不能靠嗓门大小决定权重。

2. 向量空间中的基本运算 ​

对相同维度的向量,可以逐分量相加:

x+y=(x1+y1,…,xn+yn)T.

标量乘法把每个分量乘以同一个数:

cx=(cx1,…,cxn)T.

这两种运算让我们可以构造线性组合:

a1v1+⋯+akvk.

如果一个向量能由一组向量的线性组合得到,就说它位于这组向量张成的空间中。后面求解线性方程时,问题会变成:目标向量是否位于矩阵列向量张成的空间里?

3. 范数与距离 ​

二范数描述向量的欧氏长度:

‖x‖2=x12+⋯+xn2.

两个点的欧氏距离是它们之差的长度:

d(x,y)=‖x−y‖2.

常见范数关注的东西不同:

范数定义常见直觉
L1∑i|xi|各维绝对偏差之和
L2∑ixi2直线距离
L∞maxi|xi|最坏一个维度的偏差

选择范数就是选择“什么算接近”。配送网格中可能更关心 L1 距离;误差预算可能更关心最大分量;一般几何空间常用 L2。

4. 点积与投影 ​

点积把两个同维向量映射成一个标量:

xTy=∑i=1nxiyi.

它还有几何形式:

xTy=‖x‖2‖y‖2cos⁡θ.

因此,点积同时受到方向和长度影响。若只想比较方向,可使用余弦相似度:

cos_sim(x,y)=xTy‖x‖2‖y‖2.

零向量没有方向,分母为零,不能直接计算余弦相似度。工程代码必须明确约定:拒绝零向量、返回特殊值,还是在业务层使用兜底逻辑。

向量 x 在非零向量 u 方向上的投影为:

projux=xTuuTuu.

投影会在最小二乘中再次出现:无法精确命中目标时,寻找列空间里离目标最近的点。

5. 推荐系统中的一次比较 ​

假设三维分别表示动作、喜剧和悬疑。以下完整示例使用 Python 3 与 NumPy 2;在虚拟环境中用 python -m pip install "numpy>=2,<3" 安装依赖,保存为 cosine_demo.py,运行 python cosine_demo.py。输入限定为相同维数、数值范围适中的有限实数一维数组:

python
import numpy as np

user = np.array([0.9, 0.2, 0.7], dtype=float)
movie_a = np.array([0.8, 0.1, 0.9], dtype=float)
movie_b = np.array([0.1, 0.9, 0.2], dtype=float)

def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
    denominator = np.linalg.norm(a) * np.linalg.norm(b)
    if denominator == 0:
        raise ValueError("余弦相似度不接受零向量")
    return float(a @ b / denominator)

print(f"{cosine_similarity(user, movie_a):.6f}")
print(f"{cosine_similarity(user, movie_b):.6f}")

两行输出约为 0.979471 和 0.381929,所以按这三个特征的方向比较,用户向量更接近电影 A。这只说明这次计算的排序;真实推荐还要验证特征如何得到、冷启动如何处理,以及方向接近是否对应实际喜好。

6. 缩放为什么会改变答案 ​

考虑两个特征:年龄范围约为 18–70,年消费额范围约为 0–100000。直接计算欧氏距离时,消费额几乎完全控制结果。常见处理包括:

  • 标准化:减去均值,再除以标准差;
  • 区间缩放:映射到固定范围;
  • 根据业务意义手工赋权;
  • 使用对尺度更合适的距离或学习得到的表示。

缩放会改变模型使用的几何空间。先用训练集估计均值、标准差等参数,再把同一组参数用于验证集和线上数据。用全量数据拟合会把验证信息带入训练;给验证集单独拟合则换了一套坐标,评估的已不是原来的处理流程。交叉验证时,每一折都要只用该折的训练部分拟合。

7. 常见误区 ​

  • 点积越大就越相似:若长度差异显著,点积也可能只是反映规模。
  • 余弦相似度就是距离:它比较方向,不保留长度;是否适合要看业务。
  • 维度相同就能比较:分量语义、顺序、单位和编码版本也必须一致。
  • 叉积是通用向量相似度:常见三维叉积输出向量,解决的是另一类几何问题。

练习 ​

  1. 计算 x=(2,3) 与 y=(1,4) 的点积、二范数和余弦相似度。
  2. 构造两个二维点,使它们到原点的 L1 距离相同,而 L2 距离不同。
  3. 给推荐向量增加“观看次数”维度,解释不缩放时可能造成的偏差。
  4. 修改代码,为零向量设计一个符合你业务语义的处理策略,并写出理由。

小结 ​

比较向量前先核对分量的含义、顺序和单位,再选择需要保留的信息:范数衡量长度,距离衡量差异,余弦相似度只比较非零向量的方向。表示和缩放方式会直接影响结果。

下一课把单个向量交给矩阵:同一套变换怎样作用于一批坐标,线性方程又为什么与列空间有关。

Built with VitePress | Software Systems Atlas