python - 余弦相似度输出不同的scipy vs sklearn
问题描述
我确定我忽略了一些东西,但为什么这些输出不同?
scikit 学习
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity([[3,5,1]],[[1,2,3]])
### output `array([[0.72280632]])`
scipy
from scipy.spatial.distance import cosine
cosine([3,5,1],[1,2,3])
### output 0.27719367767579906
为什么这些不一样?根据我的计算,在分母中使用 L1 或 L2 范数似乎没有区别
解决方案
他们使用的余弦距离定义不同。
的文档字符串sklearn.metrics.pairwise.cosine_similarity
说:
计算 X 和 Y 中样本之间的余弦相似度。余弦相似度或余弦核将相似度计算为 X 和 Y 的归一化点积:
$余弦(X, Y) = < X, Y > / (||X|| * ||Y||)$
虽然scipy.spatial.distance.cosine
说:
X 和 Y 之间的余弦距离定义为
$cosine(X, Y) = 1 - < X, Y > / (||X|| * ||Y||)$。
其中 $< X, Y >$ 是 $X$ 和 $Y$ 之间的点积,$||X||$ 是 L2 范数。
(我稍微更改了文档字符串以使用相同的变量名称和数学约定以便于比较。)
基本上,你有1 - cosine_sklearn = cosine_scipy
.
推荐阅读
- mysql - MySQL -Pentaho 从模式获取视图时出错 [null]
- ios - 表格视图不附加表格视图单元格
- android - 内部类的意图(SettingsActivity)
- linux - Docker - 在 Centos 中提取时出错(无效的 tar 标头)
- c# - ASP.Net 核心验证问题状态 - 绑定验证不返回问题详细信息
- react-native - 获取相对于 Image 的触摸事件坐标
- javascript - 扩展功能原型的可能性
- php - PHP - 打印 PDF 文件
- azure - 如何使用 SSMS 连接到没有防火墙规则的 SQL 数据库?
- javascript - 为实用方法提供 Redux 存储