Python 如何计算两个大型稀疏矩阵之间的余弦相似性?
我想计算两个巨大稀疏矩阵的每对行之间的余弦相似性。传统的函数计算所有对行,在我的例子中,甚至更“容易”,我没有找到实现来做到这一点 例如:对于N中的所有i,结果将是一个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
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
以了解确切的方法)。