2017-06-28 10 views
-1

私はsklearnの余弦距離の式を使ってNxN類似行列を計算したいと思います。私の問題は、私のマトリックスが非常に大きいことです。それは約1000項目があります。私の現在のアプローチは非常に遅く、実際のスピードアップが必要です。誰も私がコードをスピードアップするのを助けることができますか?パンダの行列と距離行列をできるだけ早く

for i in similarity_matrix.columns: 
    for j in similarity_matrix.columns: 
     if i == j: 
      similarity_matrix.ix[i,j] = 0 
     else: 
      similarity_matrix.ix[i,j] = cosine(documents[int(i)], documents[int(j)]) 

ボーナスタスク:さらに、加重コサイン式を使用したいと思います。しかし、それはsklearnに実装されていないようです?本当?

+0

あなたはscipyのダウンロード[cdist](https://docs.scipy.org/doc/scipy-0.19.0/referenceを試してみました/generated/scipy.spatial.distance.cdist.html)? – Divakar

+0

ませおかげで私はあなたにもパンダに 'pivot_table'を使用してみてください手動 – Coozy

+1

をチェックしません:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.htmlは – ysearka

答えて

3

for-loopsを使用するのは理想的なソリューションではありません。私はscipyのpdist関数に落ちることをお勧めします。私の読んだことは、あなたのマトリックスが1000のエントリが1000x1000であるということではないということですか?しかし、Scipyはこれを簡単に処理できます。

import numpy as np 
from scipy.spatial.distance import pdist 

res = pdist(documents.T, 'cosine') 
distances = 1-pd.DataFrame(squareform(res), index=documents.columns, columns=documents.columns) 

あなたの体重ベクトルの様子を理解することに問題がありますか? Isは一定の値ですか? Pdistはカスタム関数の追加を可能にします。たとえば、あなたは(も本当に速いです)numpyのを使用して、コサイン距離を計算することができます

pdist(X, lambda u, v: np.dot(np.dot(u, v), weightvec)/(norm(np.multiply(u, weightvec)) * norm(np.multiply(v, weightvec)))) 
+0

ああ、私が – Coozy

+0

ああ待つ考えて取り組んでいます。それはなぜ1-pd.Dataframeですか? – Coozy

+0

それはあなたが計算しようとしているものによって異なります。コサイン距離とコサイン類似度には違いがあります。詳細については、ウィキペディアをチェックしてください。https://en.wikipedia.org/wiki/Cosine_similarity –

関連する問題