余弦相似度(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距离:适合衡量“绝对距离”,常用于图像、物理空间等场景。