在许多向量之间构造成对距离矩阵的有效方法?

时间:2015-10-07 17:34:29

标签: python numpy scipy memory-efficient scalable

首先,感谢阅读并花时间回应。

第二,问题:

我有一个PxN矩阵X,其中P大约为10 ^ 6,N大约为10 ^ 3。因此,X相对较大且不稀疏。假设X的每一行都是N维样本。我想构建这些P样本之间成对距离的PxP矩阵。我们也说我对Hellinger的距离很感兴趣。

到目前为止,我依赖稀疏的dok矩阵:

def hellinger_distance(X):
    P = X.shape[0]
    H1 = sp.sparse.dok_matrix((P, P))
    for i in xrange(P):
        if i%100 == 0:
            print i
        x1 = X[i]
        X2 = X[i:P]
        h = np.sqrt(((np.sqrt(x1) - np.sqrt(X2))**2).sum(1)) / math.sqrt(2)       
        H1[i, i:P] = h
    H = H1 + H1.T
    return H

这太慢了。有更有效的方法吗?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用pdist -

中的squareformscipy.spatial.distance
from scipy.spatial.distance import pdist, squareform

out = squareform(pdist(np.sqrt(X)))/np.sqrt(2)

或者使用相同的cdist -

from scipy.spatial.distance import cdist

sX = np.sqrt(X)
out = cdist(sX,sX)/np.sqrt(2)

答案 1 :(得分:1)

除了Divakar的回复,我意识到sklearn中有一个允许并行处理的实现:

from sklearn.metrics.pairwise import pairwise_distances
njobs = 3
H = pairwise_distances(np.sqrt(X), n_jobs=njobs, metric='euclidean') / math.sqrt(2)

我会做一些基准测试并稍后发布结果。