首先,感谢阅读并花时间回应。
第二,问题:
我有一个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
这太慢了。有更有效的方法吗?非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用pdist
-
squareform
和scipy.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)
我会做一些基准测试并稍后发布结果。