欧氏距离是什么
欧氏距离(L2)衡量两个向量端点的直线距离,对向量模长敏感。它是 FAISS 的 IndexFlatL2、Milvus 的 L2 度量等实现的默认距离;在归一化向量上,它的排序结果与余弦相似度、内积完全一致,所以选哪种度量更多取决于库的默认配置与历史数据,而不是效果差异。
基本信息
| 计算公式 | sqrt(Σ(a_i − b_i)²),即两端点间的直线距离 |
|---|---|
| 代表实现 | FAISS IndexFlatL2、Milvus 的 L2、pgvector 的 <-> 操作符 |
| 与余弦的关系 | 归一化后有 ||a−b||² = 2 − 2·cos |
| 方向差异 | L2 越小越相似,与余弦的「越大越相似」相反 |
典型使用场景
- 确认库的默认度量:新建集合时未指定,多数向量库默认就是 L2
- 归一化向量的统一处理:入库与查询两侧都归一化后,距离与相似度排序等价
- 阈值兜底:用 L2 距离设「相关度不足就拒答」的判定线
- 图像特征检索:非文本向量常直接用 L2,无需改成余弦
- 跨库迁移核对:从 FAISS 迁到服务端向量库时,确认度量语义一致
L2 距离计算
L2 距离计算
import numpy as np
def l2(a, b):
a = np.asarray(a, dtype="float32") # 统一精度,避免 float64 拖慢
b = np.asarray(b, dtype="float32")
return float(np.linalg.norm(a - b)) # 相似度比较时用平方值即可
print(round(l2([0.3, 0.4, 0.5], [0.1, 0.9, 0.2]), 4))
# 索引检索时一般只返回距离平方,省去开方开销
常见度量对照
| 度量 | 取值方向 | 典型场景 |
|---|---|---|
| L2 欧氏距离 | 越小越相似 | 图像特征与已归一化的文本向量 |
| 内积 IP | 越大越相似 | 未归一化向量、推荐系统嵌入 |
| 余弦相似度 | 越大越相似 | 文本检索最常用 |
| 汉明距离 | 越小越相似 | 二值量化向量 |
归一化让两种度量等价,但前提是入库与查询两侧都做了归一化;只归一化一侧会让排序失真。
切换度量方式属于破坏性变更:旧向量在新度量下需要重建索引,阈值也要重新校准,不能只改一个配置项。
排查分数异常时先确认度量口径:控制台返回的距离是平方值还是开方值、是否做过归一化,不同工具默认值并不一致,混用会让阈值判定失效。