10.1 向量与内积:把对象变成可比较的坐标
本课目标
完成本课后,你应该能够:
- 区分向量的代数、几何和数据含义;
- 使用范数、距离、点积和余弦相似度;
- 判断两个向量能否直接比较;
- 解释为什么特征缩放会改变距离模型的结果。
1. 坐标不是对象本身
本课讨论有限维实向量,用一组有序实数作为坐标:
同一形式可以承担三种角色:
- 几何中的点或位移;
- 系统状态,例如
[CPU 使用率, 内存占用, 请求延迟]; - 特征表示,例如一部电影在“动作、喜剧、悬疑”三个维度上的权重。
向量只有连同坐标含义才有意义。[0.8, 0.1, 0.6] 本身不能说明什么;只有知道三个分量的顺序、单位和编码方法,比较才成立。把年龄、收入和点击次数直接放进同一个距离公式,数值范围最大的特征往往会主导结果。距离公式会照单计算,它可不知道“元”和“岁”不能靠嗓门大小决定权重。
2. 向量空间中的基本运算
对相同维度的向量,可以逐分量相加:
标量乘法把每个分量乘以同一个数:
这两种运算让我们可以构造线性组合:
如果一个向量能由一组向量的线性组合得到,就说它位于这组向量张成的空间中。后面求解线性方程时,问题会变成:目标向量是否位于矩阵列向量张成的空间里?
3. 范数与距离
二范数描述向量的欧氏长度:
两个点的欧氏距离是它们之差的长度:
常见范数关注的东西不同:
| 范数 | 定义 | 常见直觉 |
|---|---|---|
| 各维绝对偏差之和 | ||
| 直线距离 | ||
| 最坏一个维度的偏差 |
选择范数就是选择“什么算接近”。配送网格中可能更关心
4. 点积与投影
点积把两个同维向量映射成一个标量:
它还有几何形式:
因此,点积同时受到方向和长度影响。若只想比较方向,可使用余弦相似度:
零向量没有方向,分母为零,不能直接计算余弦相似度。工程代码必须明确约定:拒绝零向量、返回特殊值,还是在业务层使用兜底逻辑。
向量
投影会在最小二乘中再次出现:无法精确命中目标时,寻找列空间里离目标最近的点。
5. 推荐系统中的一次比较
假设三维分别表示动作、喜剧和悬疑。以下完整示例使用 Python 3 与 NumPy 2;在虚拟环境中用 python -m pip install "numpy>=2,<3" 安装依赖,保存为 cosine_demo.py,运行 python cosine_demo.py。输入限定为相同维数、数值范围适中的有限实数一维数组:
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. 常见误区
- 点积越大就越相似:若长度差异显著,点积也可能只是反映规模。
- 余弦相似度就是距离:它比较方向,不保留长度;是否适合要看业务。
- 维度相同就能比较:分量语义、顺序、单位和编码版本也必须一致。
- 叉积是通用向量相似度:常见三维叉积输出向量,解决的是另一类几何问题。
练习
- 计算
x=(2,3)与y=(1,4)的点积、二范数和余弦相似度。 - 构造两个二维点,使它们到原点的
距离相同,而 距离不同。 - 给推荐向量增加“观看次数”维度,解释不缩放时可能造成的偏差。
- 修改代码,为零向量设计一个符合你业务语义的处理策略,并写出理由。
小结
比较向量前先核对分量的含义、顺序和单位,再选择需要保留的信息:范数衡量长度,距离衡量差异,余弦相似度只比较非零向量的方向。表示和缩放方式会直接影响结果。
下一课把单个向量交给矩阵:同一套变换怎样作用于一批坐标,线性方程又为什么与列空间有关。