面试 · 2025年6月25日 0

余弦相似度(Cosine Similarity)和L2距离(欧氏距离,L2 Distance/Euclidean Distance)

余弦相似度(Cosine Similarity)L2距离(欧氏距离,L2 Distance/Euclidean Distance),并对比它们的适用场景和数学原理。


1. 余弦相似度(Cosine Similarity)

数学定义

余弦相似度衡量的是两个向量在向量空间中方向的相似程度,而不关心它们的长度。其值域为 ([-1, 1])(大多数实际应用中,向量为非负,值域为 ([0, 1]))。

公式如下:
[
\text{Cosine Similarity}(\mathbf{A}, \mathbf{B}) = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| \cdot |\mathbf{B}|}
]

  • (\mathbf{A} \cdot \mathbf{B}) 是向量的点积
  • (|\mathbf{A}|) 和 (|\mathbf{B}|) 是向量的L2范数(即长度)

直观理解

  • 取值为1:两个向量方向完全一致(夹角0°)
  • 取值为0:两个向量正交(夹角90°,完全无关)
  • 取值为-1:两个向量方向完全相反(夹角180°)

适用场景

  • 文本相似度(如TF-IDF、embedding等)
  • 只关心“内容”而不关心“量级”的场景
  • 高维稀疏向量(如NLP中的词袋模型)

优点

  • 对向量的长度不敏感,只关注方向
  • 适合归一化后的向量

2. L2距离(欧氏距离,L2 Distance/Euclidean Distance)

数学定义

L2距离衡量的是两个点在空间中的“直线距离”,即“最短路径”。其值域为 ([0, +\infty))。

公式如下:
[
\text{L2 Distance}(\mathbf{A}, \mathbf{B}) = |\mathbf{A} – \mathbf{B}|_2 = \sqrt{\sum_{i=1}^n (A_i – B_i)^2}
]

直观理解

  • 距离越小,两个向量越接近
  • 距离为0,表示两个向量完全重合

适用场景

  • 图像检索、物理空间距离
  • 向量的“量级”有实际意义的场景
  • 向量没有归一化,且长度有意义

优点

  • 直观、易于理解
  • 适合度量“绝对差异”

3. 对比与选择

特性余弦相似度L2距离(欧氏距离)
关注点方向(夹角)绝对距离(长度差异)
是否归一化通常需要不需要
取值范围([-1, 1])(常用0~1)([0, +\infty))
适合场景文本、语义、归一化向量图像、物理空间、原始向量
长度敏感性不敏感敏感

4. 代码举例

假设有两个向量A和B:

import numpy as np

A = np.array([1, 2, 3])
B = np.array([4, 5, 6])

# 余弦相似度
cos_sim = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))

# L2距离
l2_dist = np.linalg.norm(A - B)

print('Cosine Similarity:', cos_sim)
print('L2 Distance:', l2_dist)

5. 总结

  • 余弦相似度:适合衡量“方向”相似性,常用于文本、语义检索。
  • L2距离:适合衡量“绝对距离”,常用于图像、物理空间等场景。