向量由有序分量表示,还可以通过非负数描述其整体大小,并比较两个向量之间的差异或接近程度。对于具有几何意义的非零向量,还可以研究它们的方向关系。范数用于度量单个向量的大小,距离用于度量两个向量相隔多远,相似度则用于描述它们在某种意义上有多接近。
在 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)输出:
12L1 范数累加绝对值,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.03、注意不同特征的尺度
欧几里得距离和曼哈顿距离会直接受到分量尺度影响。
如果一个特征的数值范围为 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() 完成范数、距离和单位化计算,并结合点积计算余弦相似度。
“点赞有美意,赞赏是鼓励”
热门跟贴