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:
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:
E il WGS84 indica la soglia 0,5:
brc = Birch(threshold=0.5)
brc.fit(data84)
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)
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.