跳转至

P2-3.4 内积(dot product)、长度(norm)、距离(distance)、相似度(similarity)

Section ID: P2-3.4 Version: v2026.09.14

假设要为一位各买了一杯咖啡和茶的人寻找相似的购买者。各买了两杯的人与他的购买比例相同,而只买了一杯咖啡的人与他的购买数量差异更小。如何定义相似,会改变选择结果。

内积、长度、距离和相似度是将这些判断表达为数值的工具。即使使用相同的数据,改变比较标准也可能改变候选对象的排序。

购买数量与购买比例

每个向量的第一个分量表示咖啡购买量,第二个分量表示茶购买量。所有数量都是同一时间段内购买的杯数。

购买者 向量 与基准购买者的差异
基准 q [1, 1] 咖啡和茶各一杯
a [2, 2] 两种饮品的数量都是基准的两倍
b [1, 0] 咖啡数量相同,但没有买茶
c [10, 10] 两种饮品的数量都是基准的十倍

a 和 c 与 q 的购买比例相同。在坐标平面上,它们位于从原点出发的同一方向。b 的第二个分量为 0,因此方向不同,但购买数量与 q 只差一杯茶。

内积:分量相乘再相加

内积是将两个向量对应位置的分量相乘,再把结果相加。对于各有 \(n\) 个分量的实向量,计算如下。

\[ x\cdot y=x_1y_1+x_2y_2+\cdots+x_ny_n \]

对于购买量向量,将咖啡数量相乘的结果与茶数量相乘的结果相加。

\[ q\cdot a=1\times2+1\times2=4 \]

同理,q·b = 1,q·c = 20。a 和 c 与基准购买者的购买比例都相同,但购买量更大的 c 得到的内积更大。内积不仅反映方向,也反映向量的大小。 不能仅凭内积较大就认为购买比例更相似。

分量中有负数时,各乘积还可能相互抵消。例如,[1, 1]·[1, -1] = 1−1 = 0。矩阵乘法也使用内积。上一节计算的结果矩阵中,每个元素都是左侧矩阵的一行与右侧矩阵的一列的内积。

长度:到原点的距离

衡量向量长度的量称为范数。这里使用的 2-范数是从原点到向量终点的直线距离。对于两个分量,可以将其作为水平和竖直方向的长度,用勾股定理计算。

\[ \|x\|_2=\sqrt{x_1^2+x_2^2+\cdots+x_n^2} \]
\[ \|q\|_2=\sqrt{1^2+1^2}=\sqrt2,\qquad \|a\|_2=\sqrt{2^2+2^2}=2\sqrt2 \]

a 的每个分量都是 q 对应分量的两倍,因此长度也是两倍。c 的长度为 10√2,是 q 的十倍。它们的方向相同,长度却不同。

不要将 2-范数与购买杯数的总和混淆。q 的购买总量为 1+1=2 杯,但 2-范数为 √2。范数是按选定的计算规则衡量向量大小的量。

距离:两点之间的差异

欧氏距离是两个向量终点之间的直线距离。先逐个分量相减,再计算差向量的长度。

\[ d(q,a)=\|a-q\|_2 =\sqrt{(2-1)^2+(2-1)^2}=\sqrt2\approx1.414 \]
\[ d(q,b)=\sqrt{(1-1)^2+(0-1)^2}=1 \]

从原点出发的向量 q、a、b,以及独立标出的终点间距离。q 与 a 方向相同,但 b 离 q 更近。

从原点出发的箭头表示各购买者的向量,红色距离标记用于比较终点。从 q 到 a,水平和竖直方向都相差 1;从 q 到 b,只有竖直方向相差 1。因此,用这一距离比较购买数量时,b 更近。

从原点量到终点,得到向量的长度;从一个终点量到另一个终点,得到两个向量之间的距离。长度的计算方式相同,区别在于比较哪些位置。

余弦相似度:除去大小后比较方向

余弦相似度是两个向量的内积除以它们长度的乘积。两个向量的长度都必须非零。

\[ \operatorname{cos\_sim}(q,a) =\frac{q\cdot a}{\|q\|_2\|a\|_2} =\frac{4}{\sqrt2\times2\sqrt2}=1 \]

将向量的每个分量除以该向量的长度,方向不变,长度变为 1。这称为归一化为单位向量。分别归一化 q、a、c,都会得到约 [0.707, 0.707]。余弦相似度等于这样消除大小影响后两个向量的内积。

\[ \frac{q}{\|q\|_2}=\left[\frac1{\sqrt2},\frac1{\sqrt2}\right]\approx[0.707,\ 0.707] \]

归一化到长度 1 后,q、a、c 重合,b 位于横轴上。两个方向的夹角为 45 度。

虚线圆上的点到原点的距离都是 1。归一化后的 q、a、c 重合,与 b 的夹角为 45 度。q 与 b 的余弦相似度为 1/(√2×1) ≈ 0.707。

余弦相似度是两个向量夹角的余弦值。夹角从 0° 增大到 180° 时,数值从 1 降至 −1。同向时为 1,垂直时为 0,反向时为 −1。例如,[1, 1] 与 [1, -1] 垂直,因此为 0;[1, 1] 与 [-1, -1] 反向,因此为 −1。负数分量不适合表示购买杯数,但可能出现在表示其他数据的向量中。

[0, 0] 的长度为 0,既不能除以它的长度,也无法确定其方向。上述公式没有定义该向量的余弦相似度。

比较标准如何改变选择

与基准 q = [1, 1] 比较 内积 欧氏距离 余弦相似度
a = [2, 2] 4 约 1.414 1
b = [1, 0] 1 1 约 0.707
c = [10, 10] 20 约 12.728 1

按距离选择购买数量最接近的人,结果是 b。按余弦相似度选择购买比例相同的人,a 和 c 并列。选择内积最大的人,结果是购买量更大的 c。三种计算回答的是不同问题。

在这个例子中,两个坐标的含义和单位已确定,因此可以把方向解释为购买比例。要把句子嵌入的方向与语义联系起来,需要确认嵌入模型的训练方式及其使用的比较标准。余弦相似度本身并不判断句子的含义。对于 k-NN 和向量检索,也需要同时检查向量表示与比较标准。

距离还受分量单位和数量级的影响。如果一个分量是购买杯数,另一个是消费金额,金额对应的较大数值可能对距离产生更大的影响。仅把整个向量的长度变为 1,并不能自动解决不同分量的单位问题。

练习:购买量翻倍

把 a = [2, 2] 改为 a′ = [4, 4],基准 q = [1, 1] 保持不变。先预测内积、到 q 的距离和余弦相似度分别会增大还是保持不变,再进行计算。

计算与解析

内积从 4 增大到 8。距离从 √2 增大到 √(3²+3²)=3√2。余弦相似度仍为 8/(√2×4√2)=1,因为购买数量增加了,但购买比例没有改变。

检查清单

  • 能否用 a 和 c 的计算说明向量大小如何影响内积?
  • 能否区分向量长度与两个向量之间的距离分别从哪里量起?
  • 能否根据分量之差直接计算欧氏距离?
  • 能否解释为什么比较购买数量时选择 b,比较购买比例时选择 a 和 c?
  • 能否从图中看出归一化使长度变为 1,同时保持方向不变?
  • 能否解释为什么余弦相似度公式不能用于长度为 0 的向量?

来源与参考资料

  • NumPy Developers,numpy.dot。官方文档明确说明,一维数组计算内积,二维数组计算矩阵乘法,为本节的内积解释提供依据。numpy.dot / 查阅日期:2026-07-19
  • NumPy Developers,numpy.linalg.norm。官方文档说明向量范数和矩阵范数,支持将范数理解为大小的度量。numpy.linalg.norm / 查阅日期:2026-07-19
  • scikit-learn developers,cosine_similarity。官方文档将余弦相似度定义为归一化内积,为相似度与方向比较的联系提供依据。cosine_similarity / 查阅日期:2026-09-08