He investigado un poco. Tomé algunos puntos en dos sistemas de coordenadas no métricos (WGS84) y métricos (Polonia 1992).
Usé este código:
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)
Luego ajusto nuestro modelo con datos métricos:
brc.fit(data90)
Y trace los resultados, donde las cruces fueron mis puntos y los círculos fueron mis subgrupos:
c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()
Esto es lo que conseguí:
Puede ver que ese valor de umbral era demasiado pequeño porque encontró un subgrupo en cada punto.
Definición de umbral:
El radio del subgrupo obtenido mediante la fusión de una nueva muestra y el subgrupo más cercano debe ser menor que el umbral. De lo contrario, se inicia un nuevo subgrupo.
Entonces, en este caso, necesitamos aumentar este valor.
Por:
brc = Birch(threshold=5000)
fue mucho mejor:
Y los puntos WGS84 para el umbral 0.5:
brc = Birch(threshold=0.5)
brc.fit(data84)
Solo un subgrupo, no es bueno. Pero en este caso deberíamos disminuir el valor umbral, entonces para 0.05:
brc = Birch(threshold=0.05)
brc.fit(data84)
Tenemos buenos resultados.
Conclusión:
CRS importa. Debe encontrar un valor umbral adecuado, depende de sus sistemas de coordenadas de datos y la distancia entre puntos. Si tiene CRS no métrico, el umbral debe ser relativamente más pequeño que con el sistema métrico. Debe saber la diferencia entre metros y grados, si la distancia entre dos puntos es igual a 10000 m, será menor a 1 grado en WGS84. Consulte google para obtener valores más precisos.
También hay más puntos que el valor n_clusters. Está bien, no hay centroides de grupos, sino subgrupos. Si intenta predecir algo o imprimir etiquetas, clasificará su punto en una de las áreas n_clusters (o imprimirá puntos clasificados en 0,1,2, ..., etiqueta n_clusters).
Si no desea probar diferentes parámetros, siempre puede tomar otro algoritmo. Algoritmo muy simple y común para la agrupación es el algoritmo K-means.
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
Debería encontrar n grupos para sus datos sin importar los umbrales, etc.