2016-04-12 25 views
2

Python ve Panda'larda oldukça yeni. Bir Pandalar Datframe içinde ben şu var sütunlar: Pandaları kullanarak satırlar arasında benzerlik/mesafe hesaplayın daha hızlı

yıl sütunlara artistHotnesss gelen sayısal verilerle SongNumber songID ALBUMID ArtistID similarArtists artistHotttnesss songHotness ses yüksekliği tempo yıl

. yüzden aşağıdaki kodu kullanarak şarkılar arasındaki mesafe/kosinüs hesaplama çalıştı:

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) 

Yani bu aslında 10^4 * 10^4 kez sarılarak gerektirir. Bunu m = 1000 için gerçekleştirirsem, 2249 sn veya 37.48 dakika içinde sonuç elde ederim, bu yüzden m = 10000 için sonuçları zamanında alamıyorum.

Nasıl hızlandırabilirim (döngüleri önlemek için? Panda işlevleri)?

sayesinde yardım

cevap

4

için Sen scikit-learn yılında euclidean_distances işlevini kullanarak döngüler kullanarak önleyebilirsiniz.

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 'ifadesinin' numpy' ve 'for' döngülerinin kullanılmasından daha hızlı olduğunu ispatlayabilir misiniz? –

+0

, çünkü mesafeleri hesaplamak için döngülere karşı doğrusal cebir kullanır. belgelere göre, formülü dist (x, y) = sqrt (nokta (x, x) - 2 * nokta (x, y) + nokta (y, y)) (nokta nokta ürünüdür) – dmb

+0

İsterseniz numol ile kendi vectorized fonksiyonunuzu yapın, ama döngüler için daha hızlı – dmb