Clustering coordinate di posizione geografica (lat, coppie lunghe)


51

Qual è il giusto approccio e algoritmo di clustering per il clustering di geolocalizzazione?

Sto usando il seguente codice per raggruppare le coordinate di geolocalizzazione:

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()

È giusto usare i mezzi K per il clustering di geolocalizzazione, poiché utilizza la distanza euclidea e non la formula di Haversine come funzione di distanza?


Puoi anche dare un'occhiata a questa domanda simile: datascience.stackexchange.com/questions/10063/…
VividD,

Penso che la fattibilità di k-mean dipenda da dove sono i tuoi dati. Se i tuoi dati sono diffusi in tutto il mondo, non funzioneranno, poiché la distanza non è euclidea, come già detto da altri utenti. Ma se i tuoi dati sono più locali, k-mean sarebbe abbastanza buono, poiché la geometria è localmente euclidea.
Juan Ignacio Gil,

Risposte:


7

K-mean dovrebbe essere giusto in questo caso. Poiché k-mean cerca di raggrupparsi basandosi esclusivamente sulla distanza euclidea tra gli oggetti, otterrai gruppi di posizioni vicine l'una all'altra.

Per trovare il numero ottimale di cluster, puoi provare a creare un diagramma a gomito della somma all'interno del gruppo di distanza quadrata. Questo può essere utile ( http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20K-Means%20Clustering%20Analysis.ipynb )


3
Come vengono gestiti i punti vicini l'uno all'altro sul punto di avvolgimento?
casperUn

1
È necessario trovare un algoritmo che utilizza una matrice di distanza pre-calcolata o che consente di fornire una funzione di distanza che può chiamare quando è necessario calcolare le distanze. Altrimenti non funzionerà.
Spacedman,

La trama del gomito potrebbe non aiutarti affatto perché potrebbe non esserci gomito. Assicurati anche di provare diverse esecuzioni di k-mean con lo stesso numero di cluster perché potresti ottenere risultati diversi.
Cavalletta

Questa è una cattiva idea poiché tutti i punti saranno raggruppati, cosa che raramente è una buona idea nella mappatura.
Richard,

52

K-mean non è l'algoritmo più appropriato qui.

Il motivo è che k-medie è progettato per minimizzare la varianza . Questo, ovviamente, appare da un punto di vista statistico e di segnalazione, ma i tuoi dati non sono "lineari".

Poiché i dati sono in formato latitudine, longitudine, è necessario utilizzare un algoritmo in grado di gestire funzioni di distanza arbitrarie , in particolare funzioni di distanza geodetica. Il clustering gerarchico, PAM, CLARA e DBSCAN sono esempi popolari di questo.

https://www.youtube.com/watch?v=QsGOoWdqaT8 consiglia il clustering OPTICS.

I problemi dei k-media sono facili da vedere se si considerano punti vicini ai + -180 gradi. Anche se hai hackerato k- mean per usare la distanza di Haversine, nella fase di aggiornamento quando ricalcola la media il risultato verrà malamente avvitato. Il caso peggiore è che k-mean non converge mai!


Puoi suggerire un metodo di clustering più appropriato per i dati di geolocalizzazione?
Alex Spurling,

Hai notato il terzo paragrafo?
Anony-Mousse,

7

Le coordinate GPS possono essere convertite direttamente in geohash . Geohash divide la Terra in "secchi" di dimensioni diverse in base al numero di cifre (codici Geohash brevi creano grandi aree e codici più lunghi per aree più piccole). Geohash è un metodo di clustering di precisione regolabile.


Questo sembra soffrire dello stesso problema a 180 gradi che K-Means fa per l'articolo di Wikipedia collegato nella risposta.
Norman H,

Sì! Inoltre i codici sono molto meglio plus.codes
Brian Spiering

Un vantaggio di questa soluzione è che fino a quando si calcola il geohash una volta, le ripetute operazioni di confronto andranno molto più rapidamente.
Norman H,

Geohash avrà problemi con le custodie con bordo a secchio: due punti molto vicini verranno inseriti in secchi diversi in base ai bordi arbitrari di ciascun secchio.
Dan G,

5

Probabilmente sono in ritardo con la mia risposta, ma se hai ancora a che fare con il clustering geografico, potresti trovare interessante questo studio . Si occupa del confronto di due approcci abbastanza diversi per la classificazione dei dati geografici: K-clustering e modellazione della crescita di classi latenti.

Una delle immagini dello studio:

inserisci qui la descrizione dell'immagine

Gli autori hanno concluso che i risultati finali erano complessivamente simili e che c'erano alcuni aspetti in cui LCGM ha sovraperformato i mezzi K.


5

È possibile utilizzare HDBSCAN per questo. Il pacchetto python supporta la distanza haversine che calcolerà correttamente le distanze tra i punti lat / lon.

Come menzionano i documenti , per prima cosa dovrai convertire i tuoi punti in radianti. Il seguente psuedocode dovrebbe fare il trucco:

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

L'algoritmo k-mean per raggruppare le posizioni è una cattiva idea. Le tue posizioni possono essere sparse in tutto il mondo e il numero di cluster non può essere previsto da te, non solo se metti il ​​cluster come 1, le posizioni verranno raggruppate in 1 cluster singolo. Sto usando il clustering gerarchico per lo stesso.



-1

Vai con il clustering di Kmeans come HBScan impiegherà per sempre. L'ho provato per uno dei progetti e sono finito ma usando Kmeans con i risultati desiderati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.