DBSCAN clustering von geographischen Standortdaten
Ich habe einen dataframe mit Breitengrad-und Längengrad-Paare.
Hier ist mein dataframe Aussehen.
order_lat order_long
0 19.111841 72.910729
1 19.111342 72.908387
2 19.111342 72.908387
3 19.137815 72.914085
4 19.119677 72.905081
5 19.119677 72.905081
6 19.119677 72.905081
7 19.120217 72.907121
8 19.120217 72.907121
9 19.119677 72.905081
10 19.119677 72.905081
11 19.119677 72.905081
12 19.111860 72.911346
13 19.111860 72.911346
14 19.119677 72.905081
15 19.119677 72.905081
16 19.119677 72.905081
17 19.137815 72.914085
18 19.115380 72.909144
19 19.115380 72.909144
20 19.116168 72.909573
21 19.119677 72.905081
22 19.137815 72.914085
23 19.137815 72.914085
24 19.112955 72.910102
25 19.112955 72.910102
26 19.112955 72.910102
27 19.119677 72.905081
28 19.119677 72.905081
29 19.115380 72.909144
30 19.119677 72.905081
31 19.119677 72.905081
32 19.119677 72.905081
33 19.119677 72.905081
34 19.119677 72.905081
35 19.111860 72.911346
36 19.111841 72.910729
37 19.131674 72.918510
38 19.119677 72.905081
39 19.111860 72.911346
40 19.111860 72.911346
41 19.111841 72.910729
42 19.111841 72.910729
43 19.111841 72.910729
44 19.115380 72.909144
45 19.116625 72.909185
46 19.115671 72.908985
47 19.119677 72.905081
48 19.119677 72.905081
49 19.119677 72.905081
50 19.116183 72.909646
51 19.113827 72.893833
52 19.119677 72.905081
53 19.114100 72.894985
54 19.107491 72.901760
55 19.119677 72.905081
Möchte ich cluster dieser Punkte, die am nächsten zu einander(200 Meter Entfernung) folgende ist meine Distanz-matrix.
from scipy.spatial.distance import pdist, squareform
distance_matrix = squareform(pdist(X, (lambda u,v: haversine(u,v))))
array([[ 0. , 0.2522482 , 0.2522482 , ..., 1.67313071,
1.05925366, 1.05420922],
[ 0.2522482 , 0. , 0. , ..., 1.44111548,
0.81742536, 0.98978355],
[ 0.2522482 , 0. , 0. , ..., 1.44111548,
0.81742536, 0.98978355],
...,
[ 1.67313071, 1.44111548, 1.44111548, ..., 0. ,
1.02310118, 1.22871515],
[ 1.05925366, 0.81742536, 0.81742536, ..., 1.02310118,
0. , 1.39923529],
[ 1.05420922, 0.98978355, 0.98978355, ..., 1.22871515,
1.39923529, 0. ]])
Dann bewerbe ich mich DBSCAN clustering-Algorithmus auf Distanz-matrix.
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=2,min_samples=5)
y_db = db.fit_predict(distance_matrix)
Ich weiß nicht, wie zu wählen, eps & min_samples Wert. It-Cluster der Punkte, die sind, Weg zu weit, in einem cluster.(ca 2 km Entfernung) Ist es, weil es berechnet die euklidische Distanz, während clustering? bitte helfen Sie.
Beachten Sie, dass DBSCAN nicht gebunden der paarweisen Distanzen in einem cluster. Es joins setzt mit radius epsilon transitiv, was bedeutet, es gibt keine sinnvolle Obere Grenze für die maximale Entfernung (eps+eps+eps+eps+eps+... jeder join-erhöht die maximale eps, also der maximale Abstand (numCorePointsInCluster+1)*epsilon). Es ist ein design Absicht des-Algorithmus, um das zu ermöglichen.
Ist es möglich, zu begrenzen die
Nein. Wenn alles verbunden ist, alles ist ein einziger cluster-definition. Und sollte es sein, durch das Konzept des clustering: ähnlich wie die Dinge sein sollten in der gleichen cluster, egal, wie viele. Wenn Sie mehr Interesse an controlling die Größe der cluster, Sie sind wahrscheinlich mehr in eine Quantisierung Methode statt.
Ist es möglich, zu begrenzen die
cluster size
auf max, mit den verfügbaren DBSCAN Optionen?Nein. Wenn alles verbunden ist, alles ist ein einziger cluster-definition. Und sollte es sein, durch das Konzept des clustering: ähnlich wie die Dinge sein sollten in der gleichen cluster, egal, wie viele. Wenn Sie mehr Interesse an controlling die Größe der cluster, Sie sind wahrscheinlich mehr in eine Quantisierung Methode statt.
InformationsquelleAutor Neil | 2016-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
DBSCAN ist gemeint verwendet werden, die auf die raw-Daten mit einem räumlichen index für die Beschleunigung. Das einzige tool, das ich kenne, in dem die Beschleunigung für geo Entfernungen ist ELKI (Java) - scikit-learn leider unterstützt dies nur für ein paar Entfernungen wie die euklidische Distanz (siehe
sklearn.neighbors.NearestNeighbors
).Aber anscheinend können Sie genug precompute paarweisen Distanzen, so ist dies nicht (noch) ein Problem.
Jedoch Sie nicht Lesen Sie die Dokumentation sorgfältig genug, und Ihre Annahme, dass DBSCAN verwendet eine Distanz-matrix ist falsch:
verwendet euklidische Distanz die Distanz-matrix-Zeilen, die offensichtlich keinen Sinn.
Finden Sie in der Dokumentation von
DBSCAN
(Hervorhebung Hinzugefügt):ähnlich
fit_predict
:In anderen Worten, Sie tun müssen,
Ich würde etwas verwenden, weiß, z.B. zum one-way-Straßen (oder Straßen im Allgemeinen). Ich bezweifle, clustering hilft viel, aber es gibt bestimmte algorithmen zur Optimierung der route. Obwohl eine einfache greedy-Ansatz kann sein, den Weg zu gehen, wenn Sie benötigen, um schnell.
Vielen Dank für die Hilfe.
Heyy @Anony-Mousse erkannte ich deinem obigen Kommentar, und ich habe eine Frage für Sie. Ich habe eine gps-Daten von Fahrzeugen auf einer Autobahn und einer Stromschiene, die in der Nähe der Autobahn. Ich brauche nur verwenden motorwat Autos Daten, so finde ich mit DBSCAN algorith welchem Fahrzeug sind die Busse dann zum entfernen von Autobahn-Daten?
Ist das nicht ein clustering-Aufgabe, aber.Vorverarbeitung.
InformationsquelleAutor Anony-Mousse
Können Sie cluster Geo-Breitengrad-Längengrad-Daten mit scikit-learn ist DBSCAN ohne precomputing einer Distanz-matrix.
Dieser kommt aus diesem tutorial auf clustering Geo-Daten mit scikit-learn DBSCAN. Insbesondere, beachten Sie, dass die
eps
- Wert ist immer noch 2 km, aber es ist geteilt durch 6371 umwandeln in Bogenmaß. Beachten Sie auch, dass.fit()
nimmt die Koordinaten in Radiant-Einheiten für die haversine-Metrik.InformationsquelleAutor eos
Ich weiß nicht, was die Umsetzung von
haversine
du verwendest, aber es sieht aus wie es gibt Ergebnisse zurück, in km, soeps
werden sollte, 0.2, 2 für 200 m ein.Für die
min_samples
parameter, hängt davon ab, was Ihre erwartete Ergebnis ist. Hier sind ein paar Beispiele. Meine Ausgänge sind über eine Implementierung vonhaversine
basierend auf diese Antwort das gibt eine Distanz-matrix-ähnlich, aber nicht identisch mit Ihnen.Dies ist mit
db = DBSCAN(eps=0.2, min_samples=5)
Dies schafft drei Cluster
0, 1
und2
, und viele der Proben fallen Sie nicht in einem cluster mit mindestens 5 Mitglieder und sind somit keine Zuordnung zu einem cluster (dargestellt als-1
).Versuchen Sie es erneut mit einer kleineren
min_samples
Wert:db = DBSCAN(eps=0.2, min_samples=2)
Hier die meisten Proben sind innerhalb 200m von mindestens einer weiteren Probe und fallen so in eine von acht Clustern
0
zu7
.Bearbeitet, um hinzufügen
Sieht es aus wie @Anony-Mousse ist Recht, obwohl ich nicht sehen, nichts falsch in meiner Ergebnisse. Zum Wohle der Beitrag etwas, hier ist der code, den ich verwendet wurde, um zu sehen, die Cluster:
Wenn Sie sagen, dass es Cluster-Punkte, die sind zu weit voneinander entfernt, bedeuten Sie weit von der nächsten Stelle in dem cluster oder aus dem am weitesten entfernten Punkt im cluster?
Wie kann ich wissen, die Grenze des Clusters? Ich bin neu clustering. Der Punkt, den ich versuche zu machen ist, die Entfernung zwischen zwei Punkten ist mehr als 2 km, aber es gehört in einem cluster.
Können Sie mir ein Beispiel nennen? Ich bin nicht zu sehen, dass meine Ergebnisse. Es sei denn, Sie denken
-1
als ein cluster?Wie Sie sehen können, in meinem zweiten Beispiel, wenn Sie reduzieren die
min_samples
parameter erhalten Sie mehr Cluster, da die Mindestzahl der Mitglieder Voraussetzung ist niedriger, und so wird es weniger Standorten zugewiesen. Wenn Sie erhöhen dieeps
parameter dann erhalten Sie weniger Cluster mit mehr Mitgliedern. Es ist bis zu Ihnen, das ist mehr nützlich für Ihre Zwecke.InformationsquelleAutor Jamie Bull