给定稀疏矩阵数据时,Python中最快的计算余弦相似度的方法是什么?

发布于 2021-01-29 16:36:06

给定稀疏的矩阵列表,计算矩阵中各列(或行)之间的余弦相似度的最佳方法是什么?我宁愿不重复两次选择。

说输入矩阵为:

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.        ]])

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

关注者
0
被浏览
168
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以直接使用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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看