Eu fiz algumas pesquisas. Eu levei alguns pontos em dois sistemas de coordenadas não métricas (WGS84) e métricas (Polônia 1992).
Eu usei 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)
Então eu ajustei nosso modelo com dados métricos:
brc.fit(data90)
E plote os resultados, onde cruzamentos foram meus pontos e círculos foram meus subclusters:
c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()
Isto é o que eu tenho:
Você pode ver que esse valor limite era muito pequeno, porque encontrou subcluster em cada ponto.
Definição do limiar:
O raio do sub-cluster obtido pela fusão de uma nova amostra e o sub-cluster mais próximo deve ser menor que o limite. Caso contrário, um novo sub-cluster é iniciado.
Portanto, neste caso, precisamos aumentar esse valor.
Para:
brc = Birch(threshold=5000)
foi muito melhor:
E o WGS84 aponta para o limite 0,5:
brc = Birch(threshold=0.5)
brc.fit(data84)
Apenas um subcluster, não é bom. Mas, neste caso, devemos diminuir o valor limite, portanto, para 0,05:
brc = Birch(threshold=0.05)
brc.fit(data84)
Temos bons resultados.
Conclusão:
O CRS é importante. Você precisa encontrar um valor limite adequado, depende dos sistemas de coordenadas dos dados e da distância entre os pontos. Se você tiver um CRS não métrico, o limite deverá ser relativamente menor que o do sistema métrico. Você precisa saber a diferença entre metros e graus, se a distância entre dois pontos for igual a 10000m, será menor que 1 grau no WGS84. Verifique o google para obter valores mais precisos.
Também há mais pontos que o valor n_clusters. Tudo bem, não existem centróides de clusters, mas sub-clusters. Se você tentar prever algo ou imprimir etiquetas, ele classificará seu ponto em uma das áreas n_clusters (ou pontos de impressão classificados em 0,1,2, ..., etiqueta n_clusters).
Se você não quiser experimentar parâmetros diferentes, sempre poderá usar outro algoritmo. Um algoritmo muito simples e comum para clustering é o algoritmo K-means.
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
Ele deve encontrar n clusters para seus dados sem se preocupar com limites etc.