稀疏矩阵之间的余弦距离

时间:2016-04-28 16:07:18

标签: python matrix sparse-matrix

我试图了解如何使用csr_matrix API及其cosine功能,以及我遇到dimension mismatch问题。

我有以下两个(3,3)矩阵:

a = scipy.sparse.csr_matrix(np.reshape(np.arange(9), (3,3)))
b = scipy.sparse.csr_matrix(np.reshape(np.arange(9)*2+5, (3,3)))

我想计算a[0]b[0] a-la cosine(a[0], b[0])的余弦相似度(或余弦距离)。

如果我打印出a[0], b[0]的尺寸,我会得到:

(<1x3 sparse matrix of type '<class 'numpy.int64'>'
    with 2 stored elements in Compressed Sparse Row format>,
 <1x3 sparse matrix of type '<class 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>)

所以他们的尺寸匹配。但尝试cosine(a[0], b[0])会导致ValueError: dimension mismatch。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

所以问题是numpy.dot()不知道稀疏矩阵,在这里:http://docs.scipy.org/doc/scipy/reference/sparse.html

当我跑步时

>>> scipy.spatial.distance.cosine(a[0], b[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/site-packages/scipy/spatial/distance.py", line 303, in cosine
    return (1.0 - (np.dot(u, v.T) / \
  File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 287, in __mul__
    raise ValueError('dimension mismatch')
ValueError: dimension mismatch

错误发生在np.dot()中,它不理解作为参数传递的csr_matrix对象。这可以通过以下方式解决:

>>> scipy.spatial.distance.cosine(a[0].toarray(), b[0].toarray())
array([[ 0.10197349]])

显然不是你想要的答案,通过转换为密集阵列你会失去性能优势,但至少这是导致你的问题的原因。