Python 如何计算两个大型稀疏矩阵之间的余弦相似性?

Python 如何计算两个大型稀疏矩阵之间的余弦相似性?,python,numpy,scipy,sparse-matrix,cosine-similarity,Python,Numpy,Scipy,Sparse Matrix,Cosine Similarity,我想计算两个巨大稀疏矩阵的每对行之间的余弦相似性。传统的函数计算所有对行,在我的例子中,甚至更“容易”,我没有找到实现来做到这一点 例如:对于N中的所有i,结果将是一个cos数组(A[row i],B[row i]) 我已经尝试对每一行使用map,但速度非常慢。现在,我一直在尝试使用矩阵运算计算所有行 import numpy as np import scipy.sparse as sp A = sp.csr_matrix((N,N)) B = sp.csr_matrix((N,N)) A

我想计算两个巨大稀疏矩阵的每对行之间的余弦相似性。传统的函数计算所有对行,在我的例子中,甚至更“容易”,我没有找到实现来做到这一点

例如:对于N中的所有i,结果将是一个
cos数组(A[row i],B[row i])

我已经尝试对每一行使用
map
,但速度非常慢。现在,我一直在尝试使用矩阵运算计算所有行

import numpy as np
import scipy.sparse as sp

A = sp.csr_matrix((N,N))
B = sp.csr_matrix((N,N))

A_norm = sp.dok_matrix(A.shape)
A_norm[A.nonzero()] = A[A.nonzero()] / A[A.nonzero()].sum(axis=0)

B_norm = sp.dok_matrix(B.shape)
B_norm[B.nonzero()] = B[B.nonzero()] / B[B.nonzero()].sum(axis=0)

AB = (A_norm*B_norm).sum(axis=0)

AA = np.sum(np.sqrt( A_norm*A_norm ), axis=0)
BB = np.sum(np.sqrt( B_norm*B_norm ), axis=0)
AA_BB = (AA*BB)

cos = sp.dok_matrix(AB.shape)
cos[AA_BB.nonzero()] = AB[AA_BB.nonzero()] / AA_BB[AA_BB.nonzero()]
当我在上面的代码上计算(AA*BB)时会发生错误。堆栈是:

--------------------------------------------------------------------------
ValueError                               Traceback (most recent call last)
<ipython-input-244-00be56e17413> in <module>()
      9 AA = np.sum(np.sqrt( A_norm*A_norm ), axis=0)
     10 BB = np.sum(np.sqrt( B_norm*B_norm ), axis=0)
---> 11 AA_BB = (AA*BB)
     12 
     13 cos = sp.dok_matrix(AB.shape)

/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
    218         if isinstance(other, (N.ndarray, list, tuple)) :
    219             # This promotes 1-D vectors to row vectors
--> 220             return N.dot(self, asmatrix(other))
    221         if isscalar(other) or not hasattr(other, '__rmul__') :
    222             return N.dot(self, other)

ValueError: shapes (1,70765) and (1,70765) not aligned: 70765 (dim 1) != 1 (dim 0)
--------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
9 AA=np.和(np.sqrt(A_范数*A_范数),轴=0)
10bb=np.和(np.sqrt(B_范数*B_范数),轴=0)
--->11 AA_BB=(AA*BB)
12
13 cos=sp.dok_矩阵(AB.shape)
/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in_uuu_u_u_u_u(self,other)
218如果是实例(其他,(N.ndarray,list,tuple)):
219#这将一维向量提升为行向量
-->220返回N.dot(自身、asmatrix(其他))
221如果isscalar(其他)或非hasattr(其他),则:
222返回N.dot(自身、其他)
值错误:形状(170765)和(170765)未对齐:70765(尺寸1)!=1(尺寸0)

对于稀疏矩阵,
M.sum(0)
生成形状为(1,n)的密集numpy矩阵。使用
np.matrix
时,
*
运算符是矩阵乘法,
,因此对齐错误。您可以转置一个,也可以使用
乘法
(检查
np.matrix
了解确切的方法)。对于稀疏矩阵,
M.sum(0)
生成一个密集的numpy矩阵,形状为(1,n)。使用
np.matrix
时,
*
运算符是矩阵乘法,
,因此对齐错误。您必须转置一个,或者使用
乘法
(检查
np.matrix
以了解确切的方法)。