Quelle est la bonne approche et le bon algorithme de clustering pour le clustering de géolocalisation?
J'utilise le code suivant pour regrouper les coordonnées de géolocalisation:
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()
Est-il juste d'utiliser K-means pour le clustering de géolocalisation, puisqu'il utilise la distance euclidienne, et non la formule de Haversine en tant que fonction de distance?
Réponses:
K-means devrait avoir raison dans ce cas. Puisque k-means essaie de regrouper uniquement sur la base de la distance euclidienne entre les objets, vous récupérerez des groupes d’emplacements proches les uns des autres.
Pour trouver le nombre optimal de grappes, vous pouvez créer un graphe de type «coude» représentant la somme de la distance au sein d'un groupe. Cela peut être utile ( http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Clustering%20Analysis.ipynb )
la source
K-means n'est pas l'algorithme le plus approprié ici.
La raison en est que k-means est conçu pour minimiser la variance . Ceci apparaît bien sûr d'un point de vue statistique et du traitement du signal, mais vos données ne sont pas "linéaires".
Étant donné que vos données sont au format latitude et longitude, vous devez utiliser un algorithme capable de gérer des fonctions de distance arbitraires , en particulier des fonctions de distance géodésiques. Le clustering hiérarchique, PAM, CLARA et DBSCAN en est un exemple courant.
https://www.youtube.com/watch?v=QsGOoWdqaT8 recommande la mise en cluster OPTICS.
Les problèmes de k-moyennes sont faciles à voir lorsque vous considérez des points proches du cercle enveloppant + -180 degrés. Même si vous piraté k-means utiliser la distance Haversine, dans l'étape de mise à jour quand il recalcule la moyenne sera mal vissé le résultat. Dans le pire des cas, k-means ne convergera jamais!
la source
Les coordonnées GPS peuvent être converties directement en geohash . Geohash divise la Terre en "compartiments" de taille différente en fonction du nombre de chiffres (des codes Geohash courts créent de grandes zones et des codes plus longs pour des zones plus petites). Geohash est une méthode de clustering de précision ajustable.
la source
Je suis probablement très en retard avec ma réponse, mais si vous traitez toujours avec le regroupement géographique, vous trouverez peut-être cette étude intéressante. Il compare deux approches assez différentes de la classification des données géographiques: le regroupement des moyennes K et la modélisation de la croissance des classes latentes.
Une des images de l'étude:
Les auteurs ont conclu que les résultats finaux étaient globalement similaires et qu'il existait certains aspects dans lesquels la K-moyenne sur-performée par LCGM.
la source
Vous pouvez utiliser HDBSCAN pour cela. Le paquet python prend en charge la distance haversine qui calculera correctement les distances entre les points lat / lon.
Comme le mentionnent les docs , vous devrez d’abord convertir vos points en radians pour que cela fonctionne. Le psuedocode suivant devrait faire l'affaire:
la source
L'algorithme k-means pour regrouper les emplacements est une mauvaise idée. Vos emplacements peuvent être répartis à travers le monde et vous ne pouvez pas prédire le nombre de clusters. Si vous définissez le cluster sur 1, les emplacements seront regroupés en un seul cluster. J'utilise le clustering hiérarchique pour la même chose.
la source
Java Apache commons-math le fait assez facilement.
https://commons.apache.org/proper/commons-math/javadocs/api-3.1/org/apache/commons/math3/stat/clustering/DBSCANClusterer.html
la source
Allez avec le regroupement Kmeans car HBScan prendra une éternité. Je l'ai essayé pour l'un des projets et j'ai fini en utilisant Kmeans avec les résultats souhaités.
la source