私は非常に大きなサイピーススパースcsrマトリックスを持っています。これは100,000×2,000,000次元の行列です。それをX
としましょう。各行は、2,000,000次元の空間内のサンプルベクトルです。凝縮されたペアワイズ距離を直接得る方法は?
サンプルの各ペア間のコサイン距離を非常に効率的に計算する必要があります。私はX
のベクトルのサブセットでsklearn pairwise_distances
関数を使用しています。これは、稠密な行列Dを与えます。冗長なエントリを含む対の距離の2乗形式です。 sklearn pairwise_distances
を使用して凝縮されたフォームを直接取得するにはどうすればよいですか?凝縮されたフォームが何であるかは、http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.htmlを参照してください。 scipy pdist
の出力です。
私にはメモリの制限があり、四角形を計算して凝縮された形にすることはできません。メモリの制限のために、私はscipy pdist
を使用することもできません。密度の高い行列X
が必要であり、再びメモリに収まらないからです。私はX
の異なるチャンクをループすることを考え、各チャンクの凝縮されたフォームを計算し、完全に凝縮されたフォームを得るために一緒に結合しましたが、これは比較的厄介です。どんな良いアイデアですか?
ご協力いただきありがとうございます。前もって感謝します。
以下は(X
がはるかに小さいデモの目的のためのコースの)再現性の例である:
from scipy.sparse import rand
from scipy.spatial.distance import pdist
from sklearn.metrics.pairwise import pairwise_distances
X = rand(1000, 10000, density=0.01, format='csr')
dist1 = pairwise_distances(X, metric='cosine')
dist2 = pdist(X.A, 'cosine')
あなたがdist2
を見るように凝縮形態であり、499500次元のベクトルです。しかし、dist1
は対称の正方形であり、1000x1000の行列です。
。私たちはコピー&ペーストして実行できるものです。明らかに、それは記憶の問題にぶつからないでしょう。しかし、まったく同じ問題に取り組んでいない限り、あなたの口頭での記述は難しいです。私はスパース行列のコードをよく知っていますが、 'sklearn'と一緒に作業していません。だから凝縮された形のような用語は外国語です。 – hpaulj
@ hpauljそれはすべてのように、最終的にstackoverflowで尋ねられるようです:http://stackoverflow.com/questions/13079563/how-does-condensed-distance-matrix-work-pdist –
また、 /下の三角形(またはその両方)を値のベクトルから削除します。 – hpaulj