2016-04-12 3 views
2

私はPythonとPandasにはかなり新しいです。 私はパンダDatframeの列を次のようしている。パンダを使用して類似度/行間の距離をより速く計算する

SongNumber songID ALBUMID ARTISTID similarArtists artistHotttnesss songHotnessラウドネステンポ年

年の列にartistHotnesssから数値データで。 だから私は以下のコードを使用して曲間の距離/コサインを計算してみました:

t1=time() 
m = 1000 
mat = np.zeros((m, m)) 

for i in range(0,m): 
    for j in range(0,m): 
     if i != j: 
      mat[i][j] = euclidean(data.ix[i,5:], data.ix[j,5:]) 
      '''if data.ix[i,2] == data.ix[j,2]: 
       mat[i][j] += 1 
      if data.ix[i,3] == data.ix[j,3]: 
       mat[i][j] += 1 
      #l1,l2 - list of similar artists 
      l1_str = data.ix[i,4].strip(']')[1:] 
      l2_str = data.ix[j,4].strip(']')[1:] 
      l1 = l1_str.split() 
      l2 = l2_str.split() 
      common = len(set(l1).intersection(l2)) 
      mat[i][j] += common 
      mat[i][j] /= 3''' 
     else: 
      mat[i][j] = 0.0 
t2 =time() 
print(t2-t1) 

だから、これは基本的に10^4 * 10^4回のループが必要です。 これをm = 1000に対して実行すると、2249秒または37.48分で結果が得られるので、m = 10000の結果は得られません。

私はどのように高速化できますか(ループやパンダの機能を避ける)?

おかげで助け

答えて

4

のためにあなたはscikit-learneuclidean_distances機能を使って、ループを使用して回避することができます。

from sklearn.metrics.pairwise import euclidean_distances 
import numpy as np 

mat = np.random.rand(5, 5) 
pairwise_dist_mat = euclidean_distances(mat) 
pairwise_dist_mat 
array([[ 0.  , 1.19602663, 1.08341967, 1.07792121, 1.1245057 ], 
    [ 1.19602663, 0.  , 0.52135682, 0.82797734, 0.78247091], 
    [ 1.08341967, 0.52135682, 0.  , 0.87764513, 0.81903634], 
    [ 1.07792121, 0.82797734, 0.87764513, 0.  , 0.1386294 ], 
    [ 1.1245057 , 0.78247091, 0.81903634, 0.1386294 , 0.  ]]) 
+0

'sklearn 'を使って証明することは、' numpy'と 'for'ループを使うよりも速いのですか? –

+0

は、forループとは異なり線形代数を使用して距離を計算するためです。 (x、y)= sqrt(dot(x、x) - 2 * dot(x、y)+ dot(y、y))(ドットは内積) – dmb

+0

することができます。必要ならnumpyで独自のベクトル化関数を作成しますが、forループが高速になる方法はありません – dmb

関連する問題