J'ai fait des recherches. J'ai pris quelques points dans deux systèmes de coordonnées non métriques (WGS84) et métriques (Pologne 1992).
J'ai utilisé ce code:
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)
Ensuite, j'adapte notre modèle avec des données métriques:
brc.fit(data90)
Et tracez les résultats, où les croix étaient mes points et les cercles étaient mes sous-groupes:
c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()
Voici ce que j'ai obtenu:
Vous pouvez voir que cette valeur de seuil était trop petite, car elle a trouvé un sous-cluster en chaque point.
Définition du seuil:
Le rayon du sous-cluster obtenu en fusionnant un nouvel échantillon et le sous-cluster le plus proche doit être inférieur au seuil. Sinon, un nouveau sous-cluster est démarré.
Dans ce cas, nous devons donc augmenter cette valeur.
Pour:
brc = Birch(threshold=5000)
c'était beaucoup mieux:
Et le WGS84 pointe pour le seuil 0,5:
brc = Birch(threshold=0.5)
brc.fit(data84)
Un seul sous-cluster, pas bon. Mais dans ce cas, nous devrions diminuer la valeur de seuil, donc pour 0,05:
brc = Birch(threshold=0.05)
brc.fit(data84)
Nous avons de bons résultats.
Conclusion:
CRS est important. Vous devez trouver une valeur de seuil appropriée, dépend de vos systèmes de coordonnées de données et de la distance entre les points. Si vous avez un CRS non métrique, le seuil doit être relativement plus petit qu'avec le système métrique. Il faut savoir la différence entre les mètres et les degrés, si la distance entre deux points est égale à 10000m, elle sera inférieure à 1 degré en WGS84. Vérifiez Google pour des valeurs plus précises.
Il y a également plus de points que la valeur n_clusters. C'est bon, il n'y a pas de centroïdes de clusters, mais des sous-clusters. Si vous essayez de prédire quelque chose ou d'imprimer des étiquettes, il classera votre point dans l'une des zones n_clusters (ou imprimera des points classés en 0,1,2, ..., n_clusters label).
Si vous ne voulez pas essayer différents paramètres, vous pouvez toujours prendre un autre algorithme. L'algorithme très simple et commun pour le clustering est l'algorithme K-means.
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
Il devrait trouver n clusters pour vos données sans se soucier des seuils, etc.