Ich habe einen Datenrahmen mit Breiten- und Längengradpaaren.
Hier sieht mein Dataframe aus.
%Vor%Ich möchte diese Punkte, die am nächsten sind (200 Meter Entfernung), zusammenfassen. Das ist meine Entfernungsmatrix.
%Vor%Dann verwende ich den DBSCAN-Clustering-Algorithmus für die Entfernungsmatrix.
%Vor%Ich weiß nicht, wie man eps & amp; min_samples Wert. Es gruppiert die Punkte, die viel zu weit sind, in einem Cluster (ca. 2 km Entfernung). Liegt es daran, dass es die euklidische Distanz während der Clusterbildung berechnet? bitte helfen.
DBSCAN ist gemeint für die Verwendung in den Rohdaten mit einem räumlichen Index für die Beschleunigung. Das einzige Werkzeug, das ich kenne mit Beschleunigung für Geo-Distanzen ist ELKI (Java) - scikit-learn unterstützt das leider nur für eine einige Entfernungen wie euklidische Entfernung (siehe sklearn.neighbors.NearestNeighbors
).
Aber anscheinend können Sie paarweise Abstände vorausberechnen, also ist dies (noch) kein Problem.
Allerdings haben Sie die Dokumentation nicht sorgfältig genug gelesen , und Ihre Annahme, dass DBSCAN eine Entfernungsmatrix verwendet, ist falsch:
%Vor%verwendet euklidische Entfernung in den Zeilen der Entfernungsmatrix , was offensichtlich keinen Sinn ergibt.
Siehe die Dokumentation von DBSCAN
(Hervorhebung hinzugefügt):
Klasse sklearn.cluster.DBSCAN (eps = 0.5, min_samples = 5, metrisch = 'euklidisch' , algorithm = 'auto', leaf_size = 30, p = None, random_state = None)
metrisch : string oder aufrufbar
Die zu verwendende Metrik bei der Berechnung der Entfernung zwischen Instanzen in einem Feature-Array. Wenn metric ein String oder ein Callable ist, muss es eine der Optionen sein, die metrics.pairwise.calculate_distance für seinen metric-Parameter zulässt. Wenn die Metrik "vorberechnet" ist, wird X als Abstandsmatrix angenommen und muss quadratisch sein. X kann eine dünn besetzte Matrix sein, in diesem Fall können nur "von Null verschiedene" Elemente als Nachbarn für DBSCAN betrachtet werden.
ähnlich für fit_predict
:
X : Array oder Sparse (CSR) Matrix der Form (n_samples, n_features) oder Array der Form (n_samples, n_samples)
Ein Feature-Array oder ein Array von Abständen zwischen Stichproben if metric = 'precomputed'.
Mit anderen Worten, Sie müssen
tun %Vor%Sie können räumliche Längen- und Breitengraddaten mit dem DBSCAN von scikit-learn kombinieren, ohne eine Abstandsmatrix vorberechnen zu müssen.
%Vor% Dies kommt aus diesem Tutorial zum Clustering räumlicher Daten mit scikit -learn DBSCAN . Beachten Sie insbesondere, dass der eps
-Wert immer noch 2 km beträgt, aber durch 6371 geteilt wird, um ihn in Radiant umzuwandeln. Beachten Sie auch, dass .fit()
die Koordinaten in Radiant-Einheiten für die hairsine-Metrik verwendet.
Ich weiß nicht, welche Implementierung von haversine
Sie verwenden, aber es sieht so aus, als ob es Ergebnisse in km zurückgibt, also sollte eps
0,2 sein, nicht 2 für 200 m.
Für den Parameter min_samples
hängt das von der erwarteten Ausgabe ab. Hier sind ein paar Beispiele. Meine Ausgaben verwenden eine Implementierung von haversine
basierend auf dieser Antwort , die eine Distanzmatrix ergibt, die ähnlich wie Ihre ist, aber nicht identisch ist .
Dies ist mit db = DBSCAN(eps=0.2, min_samples=5)
[0 -1 -1 -1 1 1 1 -1 -1 1 1 1 2 2 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1 2 0 -1 1 2 2 0 0 0 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 1]
Dies erzeugt drei Cluster, 0, 1
und 2
, und viele der Samples fallen nicht in einen Cluster mit mindestens 5 Mitgliedern und sind daher keinem Cluster zugeordnet (dargestellt als -1
).
Versuchen Sie es erneut mit einem kleineren min_samples
-Wert:
db = DBSCAN(eps=0.2, min_samples=2)
[0 1 1 2 3 3 3 4 4 3 3 3 5 5 3 3 3 2 6 6 7 3 2 2 8 8 8 3 3 6 3 3 3 3 3 5 0 -1 3 5 5 0 0 0 6 -1 -1 3 3 3 7 -1 3 -1 -1 3]
Hier liegen die meisten Proben innerhalb von 200m von mindestens einer anderen Probe und fallen somit in einen von acht Clustern 0
bis 7
.
Bearbeitet zum Hinzufügen
Es sieht so aus als ob @ Anony-Mousse recht hat, obwohl ich in meinen Ergebnissen nichts falsches gesehen habe. Um etwas beizutragen, hier ist der Code, den ich verwendet habe, um die Cluster zu sehen:
%Vor%Tags und Links python cluster-analysis dbscan