【发布时间】:2015-09-27 08:14:38
【问题描述】:
我有一个大的稀疏矩阵 - 使用 scipy 中的 sparse.csr_matrix。这些值是二进制的。对于每一行,我需要计算到同一矩阵中每一行的 Jaccard 距离。最有效的方法是什么?即使对于 10.000 x 10.000 矩阵,我的运行时间也需要几分钟才能完成。
目前的解决方案:
def jaccard(a, b):
intersection = float(len(set(a) & set(b)))
union = float(len(set(a) | set(b)))
return 1.0 - (intersection/union)
def regions(csr, p, epsilon):
neighbors = []
for index in range(len(csr.indptr)-1):
if jaccard(p, csr.indices[csr.indptr[index]:csr.indptr[index+1]]) <= epsilon:
neighbors.append(index)
return neighbors
csr = scipy.sparse.csr_matrix("file")
regions(csr, 0.51) #this is called for every row
【问题讨论】:
-
您能否详细说明导致您的运行时的实现细节?
-
啊,对不起。添加了代码。
-
我会从使用(大概)优化的 jaccard 函数开始,例如docs.scipy.org/doc/scipy/reference/generated/…
-
或者您可以使用
'metric'='jaccard'将整个数组简单地传递给sklearn 中的pairwise_distances。然后,您可能也会从执行的优化矩阵运算而不是循环中受益。看起来也可以并行化(设置n_jobs=-1)scikit-learn.org/stable/modules/generated/… 你可能需要先做csr.todense()。我的猜测是,与您提供的实现相比,这种方法的效率会大大提高 -
试过了,它似乎需要更多的时间,更多的内存,因为 'jaccard' 指标不支持稀疏。
标签: python numpy scipy sparse-matrix