Clustering von Geostandortkoordinaten (Lat, lange Paare)


51

Was ist der richtige Ansatz und Clustering-Algorithmus für das Geolocation-Clustering?

Ich verwende den folgenden Code, um Geolocation-Koordinaten zu clustern:

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.vq import kmeans2, whiten

coordinates= np.array([
           [lat, long],
           [lat, long],
            ...
           [lat, long]
           ])
x, y = kmeans2(whiten(coordinates), 3, iter = 20)  
plt.scatter(coordinates[:,0], coordinates[:,1], c=y);
plt.show()

Ist es richtig, K-means für das Geolocation-Clustering zu verwenden, da es die euklidische Distanz und nicht die Haversine-Formel als Distanzfunktion verwendet?


Sie können sich auch diese ähnliche Frage ansehen
VividD

Ich denke, die Machbarkeit von k-means hängt davon ab, wo sich Ihre Daten befinden. Wenn Ihre Daten auf der ganzen Welt verteilt sind, funktionieren sie nicht, da die Entfernung nicht euklidisch ist, wie andere Benutzer bereits mitgeteilt haben. Wenn Ihre Daten jedoch lokaler sind, ist k-means ausreichend, da die Geometrie lokal euklidisch ist.
Juan Ignacio Gil

Antworten:


7

K-means sollte in diesem Fall stimmen. Da k-means versucht, eine Gruppierung nur anhand des euklidischen Abstands zwischen Objekten vorzunehmen, erhalten Sie Cluster von Standorten, die nahe beieinander liegen.

Um die optimale Anzahl von Clustern zu finden, können Sie versuchen, ein 'Ellbogen'-Diagramm der Summe der Quadratabstände innerhalb der Gruppe zu erstellen. Dies kann hilfreich sein ( http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Clustering%20Analysis.ipynb )


3
Wie werden Punkte auf dem Umlaufpunkt nahe beieinander gehandhabt?
casperOne

1
Sie müssen einen Algorithmus finden, der eine vorberechnete Entfernungsmatrix verwendet oder die Bereitstellung einer Entfernungsfunktion ermöglicht, die aufgerufen werden kann, wenn Entfernungen berechnet werden müssen. Sonst klappt es nicht.
Spacedman

Das Ellenbogenplot hilft Ihnen möglicherweise überhaupt nicht, da möglicherweise kein Ellenbogen vorhanden ist. Stellen Sie außerdem sicher, dass Sie mehrere Läufe von k-means mit derselben Clusternummer ausführen, da dies zu unterschiedlichen Ergebnissen führen kann.
Grasshopper

Dies ist eine schlechte Idee, da alle Punkte gruppiert werden, was beim Mapping selten eine gute Idee ist.
Richard

52

K-means ist hier nicht der am besten geeignete Algorithmus.

Der Grund dafür ist, dass k-means so ausgelegt ist, dass die Varianz minimiert wird . Dies erscheint natürlich aus statistischer und signaltechnischer Sicht, aber Ihre Daten sind nicht "linear".

Da Ihre Daten im Längen- und Breitengradformat vorliegen, sollten Sie einen Algorithmus verwenden, der beliebige Entfernungsfunktionen, insbesondere geodätische Entfernungsfunktionen, verarbeiten kann. Hierarchisches Clustering, PAM, CLARA und DBSCAN sind beliebte Beispiele dafür.

https://www.youtube.com/watch?v=QsGOoWdqaT8 empfiehlt OPTICS-Clustering.

Die Probleme von k-means sind leicht zu erkennen, wenn Sie Punkte in der Nähe von + -180 Grad betrachten. Selbst wenn Sie k-means gehackt haben, um die Haversine-Distanz zu verwenden, wird das Ergebnis im Aktualisierungsschritt, wenn es den Mittelwert neu berechnet , schlecht geschraubt. Das Schlimmste ist, dass k-means niemals konvergieren wird!


Können Sie eine geeignetere Clustermethode für Geostandortdaten vorschlagen?
Alex Spurling

Haben Sie den dritten Absatz bemerkt?
Anony-Mousse

7

GPS-Koordinaten können direkt in eine Geohash umgewandelt werden . Geohash unterteilt die Erde in "Eimer" unterschiedlicher Größe, basierend auf der Anzahl der Ziffern (kurze Geohash-Codes erzeugen große Flächen und längere Codes für kleinere Flächen). Geohash ist eine einstellbare Präzisionsclustermethode.


Dies scheint unter dem gleichen 180-Grad-Problem zu leiden, das K-Means laut dem in der Antwort verlinkten Wikipedia-Artikel hat.
Norman H

Ja! Plus-Codes sind viel besser plus.codes
Brian Spiering

Ein Vorteil dieser Lösung ist, dass, solange Sie die Geohash einmal berechnen, wiederholte Vergleichsoperationen viel schneller ausgeführt werden.
Norman H

Geohash hat Probleme mit Schaufelkanten - zwei sehr nahe beieinander liegende Punkte werden basierend auf den willkürlichen Kanten jeder Schaufel in verschiedene Schaufeln gelegt.
Dan G

5

Ich bin mit meiner Antwort wahrscheinlich sehr spät dran, aber wenn Sie sich immer noch mit Geo-Clustering beschäftigen, finden Sie diese Studie möglicherweise interessant. Es geht um den Vergleich zweier ziemlich unterschiedlicher Ansätze zur Klassifizierung geografischer Daten: K-bedeutet Clustering und Latent Class Growth Modeling.

Eines der Bilder aus der Studie:

Bildbeschreibung hier eingeben

Die Autoren kamen zu dem Schluss, dass die Endergebnisse insgesamt ähnlich waren und dass es einige Aspekte gab, bei denen LCGM K-means übertraf.


5

Sie können dafür HDBSCAN verwenden . Das Python-Paket unterstützt Haversine-Entfernungen, die die Entfernungen zwischen Lat / Lon-Punkten korrekt berechnen.

Wie in den Dokumenten erwähnt , müssen Sie zuerst Ihre Punkte in Bogenmaß umrechnen, damit dies funktioniert. Der folgende Pseudocode sollte den Trick machen:

points = np.array([[lat1, lon1], [lat2, lon2], ...])
rads = np.radians(points)
clusterer = hdbscan.HDBSCAN(min_cluster_size=N, metric='haversine')
cluster_labels = clusterer.fit_predict(points)

0

Der k-means-Algorithmus zum Clustering der Standorte ist keine gute Idee. Ihre Standorte können über die ganze Welt verteilt sein und die Anzahl der Cluster kann nicht von Ihnen vorhergesagt werden. Wenn Sie den Cluster auf 1 setzen, werden die Standorte zu einem einzelnen Cluster gruppiert. Ich benutze Hierarchical Clustering für das gleiche.



-1

Entscheiden Sie sich für Kmeans-Clustering, da HBScan ewig dauern wird. Ich habe es für eines der Projekte ausprobiert und endete mit Kmeans mit den gewünschten Ergebnissen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.