2017-06-28 7 views
-1

ich eine NxN Matrix Ähnlichkeit mit der Cosinus Abstandsformel von sklearn berechnet werden soll. Mein Problem ist, dass meine Matrix sehr, sehr groß ist. Es hat ungefähr 1000 Einträge. Mein aktueller Ansatz ist sehr sehr langsam und ich brauche eine echte Beschleunigung. Kann mir jemand helfen, den Code zu beschleunigen?Pandas Matrix Matrix auf Abstand so schnell wie möglich

Bonusaufgabe: Zusätzlich möchte ich die gewichtete Kosinusformel verwenden. Aber es scheint nicht in Sklearn implementiert zu sein? Ist das wahr?

+0

Versuchen Sie Scipy [cdist] (https://docs.scipy.org/doc/scipy-0.19.0/reference /generated/scipy.spatial.distance.cdist.html)? – Divakar

+0

Nein danke ich werde das Handbuch – Coozy

+1

überprüfen Sie auch Pandas mit 'pivot_table' versuchen: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html – ysearka

Antwort

3

Verwendung von for-Schleife ist nicht die ideale Lösung. Ich würde empfehlen, auf die pdist-Funktionen von scipy zurückzugreifen. Mein lesen ist, dass Sie nicht meinen, Ihre Matrix hat 1000 Einträge aber 1000x1000? Scipy kann dies jedoch problemlos bewältigen.

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) 

Ich habe Probleme zu verstehen, wie Ihr Gewichtsvektor aussieht? Ist das ein konstanter Wert? Pdist ermöglicht das Hinzufügen von benutzerdefinierten Funktionen. Zum Beispiel können Sie Ihren Cosinus Entfernung mit numpy (die auch wirklich schnell) berechnen

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

Ah toll es funktioniert ich denke, – Coozy

+0

Oh warten. Warum ist es 1-pd.Dataframe? – Coozy

+0

Es hängt davon ab, was Sie berechnen möchten. Es gibt einen Unterschied zwischen Kosinusabstand und Kosinusähnlichkeit. Prüfen Sie Wikipedia für weitere Informationen https://en.wikipedia.org/wiki/Cosine_similarity –