sklearn.metrics.pairwise余弦相似度/距离输出超[-1,1]范围咨询
sklearn余弦计算结果超出理论取值范围的原因
首先先澄清两个容易混淆的接口定义:
cosine_similarity理论取值范围为[-1, 1],计算逻辑为两向量点积除以两向量L2范数的乘积cosine_distance理论取值范围为[0, 2],计算逻辑为1 - cosine_similarity,本身就允许出现大于1的结果(比如两向量完全反向时,余弦相似度为-1,对应余弦距离为2),这种情况不属于计算异常,是对接口返回值的概念认知偏差。
如果你确认调用的是cosine_similarity接口,仍然得到略大于1的结果,原因完全来自浮点数计算的固有精度误差:
- 计算机存储浮点数本身就存在截断误差,常用的float64类型有效精度仅为15~17位十进制数,点积、范数计算过程中的多次乘加操作会累积微小偏差
- 当两个输入向量方向几乎完全一致时,理论上相似度应该严格等于1,但如果计算得到的范数乘积比真实值小了极微量,最终除法得到的结果就会出现1.0000000000001、1.0000000002这类略超1的数值,偏差幅度通常在1e-12量级以内,不属于接口逻辑错误。
这类精度误差不会对实际业务结果产生实质影响,如果后续需要基于相似度做反余弦等严格依赖定义域的计算,手动将结果裁剪到[-1, 1]区间即可。
你可以用如下代码复现该精度问题:
import numpy as np from sklearn.metrics.pairwise import cosine_similarity vec1 = np.array([[1.23456789, 9.87654321, 5.67891234]]) vec2 = vec1 * 1.00000000001 # 两个方向几乎完全一致的向量 print(cosine_similarity(vec1, vec2)) # 典型输出: [[1.0000000000000002]]
内容的提问来源于stack exchange,提问作者striatum
相关产品推荐
相关产品推荐

