python - 在给定稀疏矩阵数据的情况下,Python 中计算余弦相似度的最快方法是什么?

标签 python numpy pandas similarity cosine-similarity

给定一个稀疏矩阵列表,计算矩阵中每个列(或行)之间的余弦相似度的最佳方法是什么?我宁愿不迭代 n-choose-two 次。

假设输入矩阵是:

A= 
[0 1 0 0 1
 0 0 1 1 1
 1 1 0 1 0]

稀疏表示为:

A = 
0, 1
0, 4
1, 2
1, 3
1, 4
2, 0
2, 1
2, 3

在 Python 中,使用矩阵输入格式很简单:

import numpy as np
from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import cosine

A = np.array(
[[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[1, 1, 0, 1, 0]])

dist_out = 1-pairwise_distances(A, metric="cosine")
dist_out

给予:

array([[ 1.        ,  0.40824829,  0.40824829],
       [ 0.40824829,  1.        ,  0.33333333],
       [ 0.40824829,  0.33333333,  1.        ]])

这对于全矩阵输入来说很好,但我真的想从稀疏表示开始(由于我的矩阵的大小和稀疏性)。关于如何最好地实现这一点的任何想法?提前致谢。

最佳答案

您可以直接使用 sklearn 在稀疏矩阵的行上计算成对余弦相似度。从 0.17 版开始,它还支持稀疏输出:

from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse

A =  np.array([[0, 1, 0, 0, 1], [0, 0, 1, 1, 1],[1, 1, 0, 1, 0]])
A_sparse = sparse.csr_matrix(A)

similarities = cosine_similarity(A_sparse)
print('pairwise dense output:\n {}\n'.format(similarities))

#also can output sparse matrices
similarities_sparse = cosine_similarity(A_sparse,dense_output=False)
print('pairwise sparse output:\n {}\n'.format(similarities_sparse))

结果:

pairwise dense output:
[[ 1.          0.40824829  0.40824829]
[ 0.40824829  1.          0.33333333]
[ 0.40824829  0.33333333  1.        ]]

pairwise sparse output:
(0, 1)  0.408248290464
(0, 2)  0.408248290464
(0, 0)  1.0
(1, 0)  0.408248290464
(1, 2)  0.333333333333
(1, 1)  1.0
(2, 1)  0.333333333333
(2, 0)  0.408248290464
(2, 2)  1.0

如果您想要逐列的余弦相似度,只需预先转置您的输入矩阵:

A_sparse.transpose()

关于python - 在给定稀疏矩阵数据的情况下,Python 中计算余弦相似度的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627219/

相关文章:

python - 为什么 int numpy 数组的逆幂为 0,尽管 "from __future__ import division"?

python - 查找两个值并填写

python - 如何更改 Python 中饼图切片的顺序

python - 我的代码无法识别 `import sklearn`

python - 如何通过其元素之和来限制 np 数组

python - 如何插入到 MultiIndex DataFrame 的特定位置?

python - 气刹 throw 错误 "pybrake - ERROR - strconv.ParseInt: parsing "无“: invalid syntax"

python - 查看移动浏览器时,Ipython/Jupyter Notebook HTML 未对齐

python - 代码终止后保持 matplotlib/pyplot 窗口打开

python - 添加数据库模块