¿Cuál es el enfoque correcto y el algoritmo de agrupación para la agrupación de geolocalización?
Estoy usando el siguiente código para agrupar las coordenadas de geolocalización:
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()
¿Es correcto usar K-means para el agrupamiento de geolocalización, ya que usa la distancia euclidiana y no la fórmula de Haversine como una función de distancia?
Respuestas:
K-means debería tener razón en este caso. Dado que k-means intenta agrupar basándose únicamente en la distancia euclidiana entre los objetos, obtendrá grupos de ubicaciones cercanas entre sí.
Para encontrar el número óptimo de grupos, puede intentar hacer un diagrama de "codo" de la suma de la distancia cuadrada dentro del grupo. Esto puede ser útil ( http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Clustering%20Analysis.ipynb )
fuente
K-means no es el algoritmo más apropiado aquí.
La razón es que k-means está diseñado para minimizar la varianza . Esto, por supuesto, aparece desde un punto de vista estadístico y de procesamiento de señal, pero sus datos no son "lineales".
Dado que sus datos están en formato de latitud y longitud, debe usar un algoritmo que pueda manejar funciones de distancia arbitrarias , en particular funciones de distancia geodésicas. El agrupamiento jerárquico, PAM, CLARA y DBSCAN son ejemplos populares de esto.
https://www.youtube.com/watch?v=QsGOoWdqaT8 recomienda la agrupación OPTICS.
Los problemas de k-means son fáciles de ver cuando considera puntos cercanos a la envoltura de + -180 grados. Incluso si hackeó k-means para usar la distancia de Haversine, en el paso de actualización, cuando vuelve a calcular la media, el resultado se verá mal. El peor de los casos es que k-means nunca convergerá.
fuente
Las coordenadas GPS se pueden convertir directamente a un geohash . Geohash divide la Tierra en "cubos" de diferente tamaño en función del número de dígitos (los códigos cortos de Geohash crean áreas grandes y códigos más largos para áreas más pequeñas). Geohash es un método de agrupamiento de precisión ajustable.
fuente
Probablemente llegue muy tarde con mi respuesta, pero si todavía está lidiando con la agrupación geográfica, puede encontrar este estudio interesante. Se trata de la comparación de dos enfoques bastante diferentes para clasificar datos geográficos: agrupamiento de K-medias y modelado de crecimiento de clase latente.
Una de las imágenes del estudio:
Los autores concluyeron que los resultados finales fueron en general similares, y que hubo algunos aspectos en los que LCGM superó el rendimiento de K-medias.
fuente
Puede usar HDBSCAN para esto. El paquete de Python tiene soporte para la distancia de Haversine que calculará correctamente las distancias entre los puntos lat / lon
Como mencionan los documentos , primero deberá convertir sus puntos a radianes para que esto funcione. El siguiente psuedocode debería hacer el truco:
fuente
El algoritmo k-means para agrupar las ubicaciones es una mala idea. Sus ubicaciones se pueden distribuir por todo el mundo y no puede predecir el número de grupos, no solo si coloca el grupo como 1, las ubicaciones se agruparán en 1 solo grupo. Estoy usando el agrupamiento jerárquico para lo mismo.
fuente
Java Apache commons-math hace esto con bastante facilidad.
https://commons.apache.org/proper/commons-math/javadocs/api-3.1/org/apache/commons/math3/stat/clustering/DBSCANClusterer.html
fuente
Vaya con la agrupación de Kmeans ya que HBScan tomará una eternidad. Lo probé para uno de los proyectos y terminé pero usando Kmeans con los resultados deseados.
fuente