5

Ich habe versucht, DBSCAN-Algorithmus von Scikit-lernen-Bibliothek mit Cosinus-Metrik verwenden, aber war mit dem Fehler stecken. Die Codezeile istDBSCAN Fehler mit Cosinus-Metrik in Python

db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)  

wo X a csr_matrix ist. Der Fehler ist der folgende:

Metric ‚Cosinus‘ nicht gültig für Algorithmus ‚auto‘,

obwohl die Dokumentation sagt, dass es möglich ist, diese Metrik zu verwenden. Ich habe versucht, Option algorithm='kd_tree' und 'ball_tree' zu verwenden, aber das gleiche erhalten. Jedoch gibt es keinen Fehler, wenn ich euclidean oder, sagen wir, l1 Metrik verwende.

Die Matrix X ist groß, daher kann ich keine vorberechnete Matrix paarweiser Abstände verwenden.

Ich verwende python 2.7.6 und scikit-learn 0.16.1. Mein Datensatz enthält keine vollständige Reihe von Nullen, daher ist die Kosinusmetrik gut definiert.

+0

Dies ist wohl ein Fehler in Sklearn, ehrlich gesagt. Kosinusähnlichkeit ist keine Metrik. Es folgt nicht der Dreiecksungleichheit, weshalb es bei einem KDTree nicht funktionieren wird und Sie keine andere Wahl haben, als es brutal zu erzwingen. All dies wirft die Frage auf, warum, wenn Sie den Algorithmus auf "auto" setzen, versucht, eine Methode zu verwenden, von der sie wissen sollte, dass sie sie nicht verwenden kann. –

+0

@AdamAcosta: Wenn ich richtig verstehe, argumentieren Sie, dass das '' auto''algorithmus'-Schlüsselwort '' brute'' verwenden sollte anstatt mit '' ball_tree'' zu versuchen und zu scheitern? (Ich würde zustimmen.) –

Antwort

9

Die Indizes in sklearn (wahrscheinlich - dies kann sich mit neuen Versionen ändern) können Cosinus nicht beschleunigen.

Versuchen Sie algorithm='brute'.

Eine Liste von Metriken, die Ihre Version von sklearn beschleunigen kann, die unterstützten Metriken des Kugelbaum sehen:

from sklearn.neighbors.ball_tree import BallTree 
print(BallTree.valid_metrics) 
+0

Danke! Jetzt funktioniert es. Erstens gab es mir einen Fehler, weil ich 'np.float32' anstelle von' np.double' für mein Dataset verwendet habe. Ich nehme an, dass DBSCAN eine solche Genauigkeit für die Kosinusmetrik benötigt, da letztere einen kleinen Bereich (zwischen 0 und 1) aufweist. – cheyp

+0

Das sollte im Allgemeinen nicht notwendig sein, aber die sklearn Implementierung kann solche Beschränkungen haben. –

4

Wenn Sie einen normalisierten Abstand wie der Cosinus Abstand möchten, können Sie auch Ihre Vektoren normalisieren zuerst und dann die euklidische Metrik verwenden. Beachten Sie, dass für zwei normalisierten Vektoren u und v die euklidische Distanz gleich sqrt (2-2 * cos (u, v)) (see this discussion)

Sie können daher so etwas wie:

Xnorm = np.linalg.norm(X,axis = 1) 
Xnormed = np.divide(X,Xnorm.reshape(Xnorm.shape[0],1)) 
db = DBSCAN(eps=0.5, min_samples=2, metric='euclidean').fit(Xnormed) 

Die Entfernungen liegen in [0,2], also stellen Sie sicher, dass Sie Ihre Parameter entsprechend anpassen.

+0

Könnten Sie ein wenig mehr darüber erweitern, warum der DBSCAN-Algorithmus mit Euklidian-distance-on-normalized-vectors das gleiche Ergebnis liefert wie der geradlinige Kosinusabstand, wenn das der Fall ist? Insbesondere was ist mit der Quadratur/Quadratwurzel, und ist es wichtig, dass der Kosinus wirklich * Ähnlichkeit * und nicht Entfernung misst (der Abstand ist '1-cos (.;.) ') –

+0

Wenn Sie beispielsweise wissen, dass' eps' mit Kosinusabstand auf 'x' gesetzt werden soll, dann sollte es bei Verwendung von DBSCAN mit' euclid' auf 'sqrt (x)' gesetzt werden. Und wenn das die Daten sind, ist die Sklearn-Indizierung, die ihren Befestigungszweck erfüllt, in Ordnung? –

+0

@NikanaReklawyks Wie ich oben erwähnt habe, was ich hier erwähnt habe, kann getan werden, um eine normalisierte Entfernung wie die Kosinus-Distanz zu erhalten. Es wird wegen der Quadrierungsoperation nicht genau dasselbe sein. Wie Sie bereits bemerkt haben, ist die Cosinus-Distanz das, was die Leute als Komplement der Cosinus-Ähnlichkeit im positiven Raum bezeichnen, es ist keine korrekte Abstandsmetrik. Aber ich gehe nicht auf diese Details ein, da die Frage nach der Kosinusentfernung gestellt wurde. – benbo

Verwandte Themen