余弦相似度是什么
余弦相似度衡量两个向量的方向夹角,取值大致落在负一到一之间,对向量长度不敏感。文本检索普遍用它:向量经过归一化后,余弦相似度等于内积,计算更省。需要注意它只看方向不看内容,话题接近但并不回答问题的片段同样可能拿到高分。
基本信息
| 取值范围 | 约 -1 到 1,越接近 1 方向越一致 |
|---|---|
| 对长度敏感性 | 不敏感,只看向量夹角 |
| 与内积的关系 | 向量归一化后两者等价 |
| 与距离的关系 | 常见向量库用 一减余弦 作为余弦距离 |
| 适用 | 文本语义相似度与向量检索排序 |
手写余弦相似度
手写余弦相似度
import numpy as np
def cosine(a, b):
a, b = np.asarray(a), np.asarray(b)
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
print(round(cosine([0.3, 0.4, 0.5], [0.1, 0.9, 0.2]), 4))使用要点
- 阈值要在自有数据上校准:文本向量的余弦值常集中在较窄区间,凭直觉定阈值会大面积误判
- 批量计算用矩阵运算:先把向量归一化再整体做矩阵乘法,比逐对计算快得多
- 防零向量:分母为零会得到无效值,入参校验不能省
- 与索引度量保持一致:评测脚本使用的相似度函数必须与线上库的度量相同
- 分数只反映语义接近,是否真正回答问题上要交给重排与生成约束
与其它度量的关系
| 度量 | 关注点 | 注意 |
|---|---|---|
| 余弦 | 方向夹角 | 长度不参与,适合文本向量 |
| 内积 | 方向与长度 | 归一化后等价于余弦 |
| 欧氏距离 | 绝对距离 | 与长度相关,多用于图像等特征 |
| 余弦距离 | 一减余弦 | 非负,便于当作损失或排序依据 |
向量已归一化时,余弦相似度等于内积,可直接用点积实现,省一次除法;这也是不少向量库把内积作为默认度量的原因。
余弦相似度的高分不等于答案正确:同一话题下的相邻段落往往也有高相似度,需要用重排与忠实度约束兜底。