Ich bin ziemlich neu in Python und Pandas. Ich habe folgende Spalten in einer Pandas Datframe:Berechnen Ähnlichkeit/Abstand zwischen Zeilen mit Pandas schneller
SongNumber songID ALBUMID artistID similarArtists artistHotttnesss songHotness Lautstärke Tempo Jahr
Mit numerischen Daten von artistHotnesss zu Jahr Spalten. So versuchte ich Berechnung Entfernung/Kosinus zwischen den Songs des folgenden Code verwendet:
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)
So erfordert dies im wesentlichen 10^4 * 10^4 mal Looping. Wenn ich dies für m = 1000 führe, erhalte ich Ergebnisse in 2249 Sekunden oder 37,48 Minuten, so dass ich die Ergebnisse für m = 10000 nicht rechtzeitig erhalte.
Wie kann ich es beschleunigen (durch die Vermeidung von Schleifen? Pandas Funktionen)?
Vielen Dank für Hilfe
Können Sie beweisen, dass 'sklearn' schneller ist als' numpy' und 'for' loops? –
weil es lineare Algebra im Gegensatz zu For-Schleifen verwendet, um Entfernungen zu berechnen. aus der Dokumentation ist die Formel dist (x, y) = sqrt (Punkt (x, x) - 2 * Punkt (x, y) + Punkt (y, y)) (wo Punkt ist das Skalarprodukt) – dmb
können Sie machen Sie Ihre eigene vektorisierte Funktion mit numpy, wenn Sie wollen, aber es gibt keine Möglichkeit, dass For-Schleifen schneller sein werden – dmb