L'algoritmo Birch non si raggruppa come previsto


10

Sto usando l'algoritmo Birch del pacchetto Python di scipy-learn per raggruppare una serie di punti in una piccola città in serie di 10.

Uso il seguente codice:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

Nella mia idea, finirei sempre con set di 10 punti. Nel mio caso ora, ho 650 punti da raggruppare e n_clusters è 65.

Ma il mio problema è che con una soglia troppo bassa finisco con 1 indirizzo un cluster, solo una soglia molto più piccola - 40 indirizzi per cluster.

Cosa sto facendo di sbagliato qui?


Forse è CRS. Problema? Se hai provato con i gradi (come WGS 84), prova la metrica. Vi è una differenza abbastanza grande nelle coordinate ed entrambe possono richiedere valori di soglia diversi. Inoltre puoi provare con diverse librerie di Python, ti consiglio vivamente di usare scikit-learn.
dmh126,

..erm, sto raggruppando sulla base delle coordinate GPS ricevute dall'API di Google, presumo siano formattate in standard. No?
kaboom,

Forse incolla qui queste coordinate, proverò a capirlo.
dmh126,

dmh126 potrebbe avere ragione: l'API Goolge sta lavorando con WGS84, questo è un sistema (mondiale) geodetico, non una metrica
André

Risposte:


10

Ho fatto delle ricerche. Ho preso alcuni punti in due sistemi di coordinate non metrici (WGS84) e metrici (Polonia 1992).

Ho usato questo codice:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

Quindi inserisco il nostro modello con dati metrici:

brc.fit(data90)

E traccia i risultati, dove le croci erano i miei punti e i cerchi erano i miei sotto-cluster:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

Questo è quello che ho ottenuto: inserisci qui la descrizione dell'immagine

Si può vedere che quel valore di soglia era troppo piccolo, perché ha trovato un cluster secondario in ogni punto.

Definizione della soglia:

Il raggio del cluster secondario ottenuto dalla fusione di un nuovo campione e il cluster secondario più vicino dovrebbe essere inferiore alla soglia. Altrimenti viene avviato un nuovo sotto-cluster.

Quindi in questo caso dobbiamo aumentare questo valore.

Per:

brc = Birch(threshold=5000)

era molto meglio:

inserisci qui la descrizione dell'immagine

E il WGS84 indica la soglia 0,5:

brc = Birch(threshold=0.5)
brc.fit(data84)

inserisci qui la descrizione dell'immagine

Un solo sotto-cluster, non buono. Ma in questo caso dovremmo ridurre il valore di soglia, quindi per 0,05:

brc = Birch(threshold=0.05)
brc.fit(data84)

inserisci qui la descrizione dell'immagine

Abbiamo dei buoni risultati.

Conclusione:

CRS conta. È necessario trovare un valore di soglia adeguato, dipende dai sistemi di coordinate dei dati e dalla distanza tra i punti. Se si dispone di CRS non metrico, la soglia deve essere relativamente più piccola rispetto al sistema metrico. Devi conoscere la differenza tra metri e gradi, se la distanza tra due punti è uguale a 10000m, in WGS84 sarà inferiore a 1 grado. Controlla su Google valori più precisi.

Inoltre ci sono più punti rispetto al valore n_clusters. Va bene, non ci sono centroidi di cluster, ma sotto-cluster. Se si tenta di prevedere qualcosa o stampare etichette, classificherà il punto in una delle aree n_clusters (o punti di stampa classificati in 0,1,2, ..., etichetta n_clusters).

Se non vuoi provare parametri diversi, puoi sempre prendere un altro algoritmo. L'algoritmo molto semplice e comune per il clustering è l'algoritmo K-mean.

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

Dovrebbe trovare n cluster per i tuoi dati senza preoccuparsi di soglie ecc.

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.