1

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

二、问题:

我有一个 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

这超级慢。有没有更有效的方法来做到这一点?任何帮助深表感谢。

4

2 回答 2

2

您可以使用pdistsquareformscipy.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)
于 2015-10-07T17:55:56.840 回答
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)

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

于 2015-10-07T18:46:30.280 回答