我正在使用大型稀疏二进制矩阵.我使用Scipy稀疏矩阵实现来压缩它们.从scipy.spatial.distance计算Jaccard距离不支持对稀疏矩阵的直接操作,因此:
>将整个稀疏矩阵转换为密集,然后在每一行上作为内存饥饿的向量进行操作
要么
>遍历稀疏,使用getrow()抓住每一行并运行.
要么
>编写我们自己的实现来处理稀疏矩阵.
为了正确看待,这里是示例代码:
import scipy.spatial.distance as d
import numpy as np
from scipy.sparse import csr_matrix
# benchmark performance
X = np.random.random((3000, 3000))
# binarize
X[X > 0.3] = 0
X[X>0] = 1
mat = csr_matrix(X)
a = np.zeros(3000)
a[4] = a[100] = a[22] =1
a = csr_matrix(a)
def jaccard_fast(v1,v2):
common = v1.dot(v2.T)
dis = (v1 != v2).getnnz()
if common[0,0]:
return 1.0-float(common[0,0])/float(common[0,0]+dis)
else:
return 0.0
def benchmark_jaccard_fast():
for i in range(mat.shape[0]):
jaccard_fast(mat.getrow(i),a)
def benchmark_jaccard_internal_todense():
for v1,v2 in zip(mat.todense(),a.todense()):
d.jaccard(v1,v2)
def benchmark_jaccard_internal_getrow():
for i in range(mat.shape[0]):
d.jaccard(mat.getrow(i),a)
pri