1

まず、お読みいただき、返信に時間を割いていただきありがとうございます。

第二に、質問:

PxN 行列 X があります。ここで、P は 10^6 のオーダーであり、N は 10^3 のオーダーです。したがって、X は比較的大きく、スパースではありません。X の各行が N 次元の標本であるとしましょう。これらの P サンプル間のペアごとの距離の PxP 行列を作成したいと考えています。また、ヘリンジャー距離に興味があるとしましょう。

これまでのところ、スパース 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

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)
于 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 に答える