向量由有序分量表示,还可以通过非负数描述其整体大小,并比较两个向量之间的差异或接近程度。对于具有几何意义的非零向量,还可以研究它们的方向关系。范数用于度量单个向量的大小,距离用于度量两个向量相隔多远,相似度则用于描述它们在某种意义上有多接近。

在 Python 中,可以使用基本语法计算常见范数,也可以使用 NumPy 的 np.linalg.norm() 完成范数、距离和向量单位化。不同度量关注的特征不同,选择合适的度量方式是数据分析和 AI 编程中的重要环节。

一、范数、距离与相似度

1、范数描述向量的大小

范数(Norm)将一个向量映射为非负标量,用于描述向量的整体大小。这种从向量到非负标量的映射,就是定义在 ℝⁿ 上的函数。

设 n 维实向量为:

向量 v 的范数通常写成:

范数越大,表示向量在相应度量下越大;零向量的范数为 0。

这里的“向量长度”指向量的几何大小,不是向量所含分量的数量。向量包含多少个分量,通常称为它的维数。

2、距离描述两个向量的差异

向量距离(Vector Distance)用于描述两个同维向量之间的差异。

许多常用距离都可以通过两个向量之差的范数定义:

也就是说,先计算从一个向量到另一个向量的差向量,再度量这个差向量的大小。

3、相似度描述两个向量的接近程度

相似度(Similarity)通常用一个数值表示两个向量有多相似。

一般来说,距离越小,两个向量越接近;相似度越大,两个向量越相似。

距离和相似度并不是简单互换的概念。不同相似度可能关注方向、分量重合程度或其他结构,具体含义取决于所采用的计算方法。

二、范数的基本性质

一个用于描述向量大小的函数,需要满足以下基本性质才能称为范数。设 u、v ∈ ℝⁿ,c ∈ ℝ。

1、非负性与确定性

范数始终大于或等于 0:

并且:

只有零向量的范数为 0。

2、绝对齐次性

向量乘以标量 c 后,范数变为原来的 |c| 倍。对于非零向量,负号会使方向反转,但不会改变范数。

3、三角不等式

两个向量之和的范数不会超过两个向量范数之和。这与几何中“三角形任意一边不超过另外两边之和”相对应。

三、常见的向量范数

1、L1 范数

L1 范数(L1 Norm)是各分量绝对值之和:

例如:

则:

L1 范数累加每个分量的绝对大小,不会通过平方进一步放大较大的分量。

2、L2 范数

L2 范数(L2 Norm)也称欧几里得范数(Euclidean Norm),定义为各分量平方和的平方根:

对于上例的向量:

L2 范数对应欧几里得空间中的直线长度,也是几何和机器学习中最常用的向量范数之一。

3、L∞ 范数

L∞ 范数(L-infinity Norm)取所有分量绝对值中的最大值:

对于上例的向量:

L∞ 范数只关注绝对值最大的分量,可以表示向量在单个分量上的最大幅度。

4、Lp 范数

L1 范数和 L2 范数都属于更一般的 Lp 范数(Lp Norm):

当 p = 1 时得到 L1 范数;当 p = 2 时得到 L2 范数。

随着 p 增大,较大的绝对分量对结果的影响更加明显。当 p 趋近于无穷大时,Lp 范数趋近于 L∞ 范数:

四、向量单位化

范数为 1 的向量称为单位向量(Unit Vector)。

对于非零向量 v,可以将它除以自身的 L2 范数,得到方向不变的单位向量:

这个过程称为 L₂ 单位化(L2 Normalization),也称向量归一化。它将向量的 L₂ 范数调整为 1,不同于把数据缩放到某个数值区间。

例如:

其 L2 范数为:

因此:

单位化后的向量满足:

单位化改变向量的大小,但不改变非零向量的方向。

零向量的范数为 0。若直接计算:

就会出现除以 0,因此零向量不能按照上述方式单位化。

五、向量距离

1、由范数定义距离

对于两个同维向量 a 和 b,可以使用不同范数度量差向量 a − b,从而得到不同类型的距离:

由范数定义的距离满足以下基本性质:

它们分别表示非负性、确定性、对称性和三角不等式。

2、曼哈顿距离

曼哈顿距离(Manhattan Distance)由 L1 范数定义:

它将各个分量方向上的差异相加,类似于在规则街区中只能沿各坐标轴方向移动。

3、欧几里得距离

欧几里得距离(Euclidean Distance)由 L2 范数定义:

它表示欧几里得空间中两个点之间的直线距离。

4、切比雪夫距离

切比雪夫距离(Chebyshev Distance)由 L∞ 范数定义:

它只关注所有分量差异中的最大值。

5、距离计算示例

设:

差向量为:

曼哈顿距离为:

欧几里得距离为:

切比雪夫距离为:

六、向量相似度

1、余弦相似度

余弦相似度(Cosine Similarity)通过夹角余弦衡量两个非零向量的方向接近程度:

对于实数向量,其取值范围为:

一般可以理解为:

接近 1:两个向量的方向接近;

接近 0:两个向量的方向接近正交;

接近 −1:两个向量的方向接近相反。

余弦相似度主要关注方向,对向量的正比例缩放不敏感。

若将一个向量乘以负数,其方向会反转,因此余弦相似度的符号也会发生变化。

2、点积相似度

在一些向量检索和机器学习任务中,可以直接使用点积作为相似度:

点积相似度同时受到向量方向和大小影响。即使两个向量方向相同,范数更大的向量通常也会得到更大的点积。

当两个向量都经过 L2 单位化时:

此时:

3、距离与相似度的关系

距离关注两个向量相差多少,余弦相似度关注两个向量的方向是否接近。

因此,两个向量可能方向相同,但欧几里得距离仍然较大。例如,一个向量可能只是另一个向量的较大正比例倍数。

对于两个经过 L2 单位化的向量 a 和 b,有:

因此,在单位向量条件下,欧几里得距离越小,余弦相似度越大,两者会产生一致的排序关系。

实践中常将:

称为余弦距离(Cosine Distance)或余弦差异。

不过,它在一般情况下不一定满足距离函数的全部性质,因此更准确地说是一种不相似度。

七、使用 Python 计算范数、距离与相似度

1、使用 Python 基本语法计算范数

可以使用列表和内置函数计算常见范数:

print(norm_linf)

输出:

12

L1 范数累加绝对值,L2 范数计算平方和的平方根,L∞ 范数取最大绝对分量。

2、使用 NumPy 计算范数

NumPy 可以使用 np.linalg.norm() 计算不同范数:

print(norm_linf)

输出:

12.0

对于一维数组,np.linalg.norm(v) 默认计算 L2 范数。

3、计算向量距离

两个向量之间的距离可以通过差向量的范数计算:

print(distance_linf)

输出:

3.0

其中,欧几里得距离约为 3.606。

4、单位化与余弦相似度

print(cosine_similarity)

输出可能为:

0.8888888888888888

两个向量经过 L2 单位化后,它们的点积就等于余弦相似度。

八、范数、距离与相似度在 AI 编程中的典型应用

1、批量单位化嵌入向量

不同数据生成的嵌入向量可能具有不同范数。在只需要比较方向时,可以对每个嵌入向量进行 L2 单位化:

print(normalized_embeddings)

axis=1 表示分别计算每一行的范数,keepdims=True 将被聚合的轴保留为长度 1,使除法能够通过广播按行完成。

2、寻找距离最近的向量

在分类、聚类和向量检索中,可以根据距离寻找最接近查询向量的候选项:

print(candidates[nearest_index])

输出可能为:

[1.2 2.1]

candidates - query 通过广播计算每个候选向量与查询向量的差,axis=1 再分别计算每一行的 L2 范数。

np.argmin() 返回距离最小元素的位置,因此第 0 个候选向量与查询向量最接近。

3、约束模型参数

范数还可以用于限制模型参数的大小。常见的 L1 和 L2 正则化形式分别为:

其中,L_data 是原始数据损失,w 是参数向量,λ 是控制正则化强度的非负系数。

L1 正则化通常更容易产生较多接近 0 或等于 0 的参数;L2 正则化则倾向于整体抑制过大的参数。具体效果还与模型、数据和优化方法有关。

九、常见问题及使用建议

1、不要混淆维数与范数

向量的维数表示分量数量,范数表示向量的大小。

例如,向量 [3, 4] 是二维向量,但其 L2 范数为 5。二维和长度为 5 描述的是不同概念。

2、单位化前检查零向量

零向量的范数为 0,不能直接作为除数。进行单位化或计算余弦相似度前,应先检查范数是否接近 0。

对于浮点数,可以使用:

np.isclose(norm_value, 0.0)

避免只依赖严格比较:

norm_value == 0.0

3、注意不同特征的尺度

欧几里得距离和曼哈顿距离会直接受到分量尺度影响。

如果一个特征的数值范围为 0 到 1,另一个特征的数值范围为 0 到 10000,后者通常会主导距离结果。因此,比较距离前常需要根据数据含义进行标准化或其他尺度处理。

4、不要把相似度直接理解为距离

相似度和距离都可以描述对象之间的关系,但关注角度不同。相似度通常衡量对象之间的相似程度,数值越大表示越接近;距离通常衡量对象之间的差异程度,数值越小表示越接近。

不同的度量方式可能关注不同的信息。例如,余弦相似度主要反映两个向量的方向关系,而欧几里得距离反映两个向量端点之间的空间差异。余弦相似度为 0 表示两个非零向量方向正交,并不表示两个向量相同或它们之间的距离为 0。

5、批量计算时明确指定轴

对于二维及更高维 NumPy 数组,np.linalg.norm() 的结果取决于 axis 和 ord 参数。

例如:

np.linalg.norm(data, axis=1)

表示分别计算每一行的 L2 范数。

对于二维数组,如果同时省略 axis 和 ord,np.linalg.norm() 会将其作为矩阵计算 Frobenius 范数,而不是分别计算每一行或每一列的向量范数。

小结

范数度量向量大小,距离度量向量差异,相似度描述向量的接近程度。L1、L2 和 L∞ 范数关注不同特征,Python 可以通过 np.linalg.norm() 完成范数、距离和单位化计算,并结合点积计算余弦相似度。

打开网易新闻 查看精彩图片

“点赞有美意,赞赏是鼓励”