L'algorithme de Birch ne se regroupe pas comme prévu


10

J'utilise l'algorithme Birch du package scipy-learn Python pour regrouper un ensemble de points dans une petite ville en ensembles de 10.

J'utilise le code suivant:

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

Dans mon idée, je me retrouverais toujours avec des ensembles de 10 points. Dans mon cas maintenant, j'ai 650 points à regrouper et n_clusters est 65.

Mais, mon problème est qu'avec un seuil trop bas, je me retrouve avec 1 adresse par cluster, juste un tout petit seuil plus grand - 40 adresses par cluster.

Qu'est-ce que je fais mal ici?


C'est peut-être CRS. Problème? Si vous avez essayé avec des degrés (comme WGS 84), essayez la métrique. Il y a une assez grande différence de coordonnées et les deux peuvent nécessiter une valeur de seuil différente. Vous pouvez également essayer avec une bibliothèque python différente, je recommande fortement d'utiliser scikit-learn.
dmh126

..erm, je suis en cluster sur la base des coordonnées GPS reçues de l'API Google, je suppose qu'elles sont au format standard. Non?
kaboom

Peut-être collez ici ces coordonnées, je vais essayer de comprendre cela.
dmh126

dmh126 pourrait avoir raison: l'API Goolge fonctionne avec WGS84, il s'agit d'un système géodésique (mondial), pas d'une métrique
André

Réponses:


10

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: entrez la description de l'image ici

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:

entrez la description de l'image ici

Et le WGS84 pointe pour le seuil 0,5:

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

entrez la description de l'image ici

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)

entrez la description de l'image ici

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.