Qual é a abordagem correta e o algoritmo de clustering para clustering de geolocalização?
Estou usando o seguinte código para agrupar coordenadas de localização geográfica:
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()
É correto usar K-means para agrupamento de geolocalização, pois usa distância euclidiana, e não a fórmula de Haversine como função de distância?
Respostas:
K-significa deve estar certo neste caso. Como o k-means tenta agrupar com base apenas na distância euclidiana entre os objetos, você receberá grupos de locais próximos um do outro.
Para encontrar o número ideal de clusters, você pode tentar fazer um gráfico de cotovelo da soma da distância quadrada dentro do grupo. Isso pode ser útil ( http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Clustering%20Analysis.ipynb )
fonte
K-means não é o algoritmo mais apropriado aqui.
A razão é que o k-means é projetado para minimizar a variação . Obviamente, isso está aparecendo do ponto de vista estatístico e de processamento de sinais, mas seus dados não são "lineares".
Como seus dados estão no formato de latitude e longitude, você deve usar um algoritmo que possa lidar com funções de distância arbitrárias , em particular funções de distância geodésica. O cluster hierárquico, PAM, CLARA e DBSCAN são exemplos populares disso.
https://www.youtube.com/watch?v=QsGOoWdqaT8 recomenda o agrupamento OPTICS.
Os problemas dos meios k são fáceis de ver quando se considera pontos próximos à curva de + -180 graus. Mesmo que você tenha hackeado o k-means para usar a distância Haversine, na etapa de atualização, quando recalcular a média, o resultado será mal ferrado. O pior caso é que o k-means nunca convergirá!
fonte
As coordenadas de GPS podem ser convertidas diretamente em uma geohash . O Geohash divide a Terra em "baldes" de tamanho diferente, com base no número de dígitos (códigos curtos de Geohash criam grandes áreas e códigos mais longos para áreas menores). Geohash é um método de agrupamento de precisão ajustável.
fonte
Provavelmente estou muito atrasado com a minha resposta, mas se você ainda está lidando com o agrupamento geográfico, pode achar este estudo interessante. Ele lida com a comparação de duas abordagens bastante diferentes para classificar dados geográficos: cluster K-significa e modelagem de crescimento de classe latente.
Uma das imagens do estudo:
Os autores concluíram que os resultados finais eram similares em geral e que havia alguns aspectos em que a LCGM superestimou as médias-K.
fonte
Você pode usar o HDBSCAN para isso. O pacote python suporta a distância do haversine, que calculará adequadamente as distâncias entre os pontos lat / lon.
Como os documentos mencionam , você precisará converter seus pontos em radianos primeiro para que isso funcione. O seguinte psuedocode deve executar o truque:
fonte
O algoritmo k-means para agrupar os locais é uma má ideia. Seus locais podem ser espalhados por todo o mundo e o número de clusters não pode ser previsto por você, não apenas que, se você colocar o cluster como 1, os locais serão agrupados em um único cluster. Estou usando o cluster hierárquico para o mesmo.
fonte
O Java Apache commons-math faz isso com bastante facilidade.
https://commons.apache.org/proper/commons-math/javadocs/api-3.1/org/apache/commons/math3/stat/clustering/DBSCANClusterer.html
fonte
Siga o clustering do Kmeans, pois o HBScan levará uma eternidade. Eu tentei para um dos projetos e terminei, mas usando o Kmeans com os resultados desejados.
fonte