2010-09-07 38 views
7

J'ai écrit un algorithme k-Means clustering dans MATLAB, et je pensais l'essayer avec MATLABs construit en kmeans(X,k). Cependant, pour la configuration très simple des quatre clusters (voir image), MATLAB kMeans ne converge pas toujours vers la solution optimale (gauche) mais vers (droite).MATLAB kMeans ne converge pas toujours vers les minima globaux

Celui que j'ai écrit ne le fait pas toujours non plus, mais la fonction intégrée ne devrait-elle pas être capable de résoudre un problème aussi facile, trouvant toujours la solution optimale?

alt text

Répondre

11

Comme expliqué par @Alexandre C., l'algorithme K-means dépend des positions initiales du centroïde de cluster, et il n'y a aucune garantie qu'il convergera vers la solution optimale. Le mieux que vous puissiez faire est de répéter l'expérience plusieurs fois avec des points de départ aléatoires.

La mise en œuvre de MATLAB offre une telle option: replicates qui répète N fois la classification et sélectionne celle qui a le plus faible total des distances point à centre du cluster. Vous obtenez également de contrôler comment les centroïdes initiaux sont choisis avec l'option start. De plus, MATLAB offre le choix entre plusieurs mesures de distance (Euclidienne, Manhattan, Cosine, ...). Une option soignée emptyaction vous permet de contrôler ce qui se passe quand un cluster perd tout son membre assigné pendant les itérations.

Mais le vrai avantage est qu'il utilise un algorithme à deux phases: les itérations d'assignation-recalculation habituelles, suivies d'une phase de mise à jour en ligne. Assurez-vous de lire la section sur l'algorithme du documentation page pour plus d'informations.

4

Le k-means est très sensible à estimation initiale pour les centres de cluster. Avez-vous essayé les deux codes avec les mêmes centres de masse initiaux?

L'algorithme est simple, et je doute qu'il y ait beaucoup de variation entre votre implémentation et celle de Matlab.

+1

Je suppose que vous avez raison. Pour obtenir une meilleure convergence, j'ai plutôt modifié mon algoritme pour faire plusieurs tentatives avec différents centres de masse initiaux, puis déterminer le meilleur en mesurant la variance des groupes. Une faible variance moyenne dans une tentative est égale à des groupes compacts. Comment ça sonne? – Theodor

+0

@Theodor: C'est un critère possible en effet. –

2

Vous serez probablement souvent déçu par la solution que n'importe quelle exécution particulière de "l'algorithme de k-means" (c'est-à-dire l'algorithme de Lloyd) arrive avec. C'est parce que l'algorithme de Lloyd est souvent bloqué dans les mauvais minima locaux.

Heureusement, Lloyd's est juste une façon de résoudre les k-means. Et il y a une approche qui trouve presque toujours de meilleurs minima locaux.

L'astuce consiste à mettre à jour les affectations de cluster des points de données un à la fois. Vous pouvez le faire efficacement en comptant le nombre de points n affectés à chaque moyenne. Alors que vous pouvez recalculer le cluster signifie m après le retrait du point x comme suit:

m_new = (n * m - x)/(n - 1) 

Et ajouter x à grappe moyenne m utilisant:

m_new = (n * m + x)/(n + 1) 

Bien sûr parce qu'il ne peut pas être vectorisé, c'est un peu pénible de fonctionner dans MATLAB mais pas trop mal dans d'autres langues.

Si vous voulez vraiment obtenir les meilleurs minima locaux, et que cela ne vous dérange pas d'utiliser un clustering basé sur l'exemple, vous devriez regarder affinity propagation. Les implémentations de MATLAB sont disponibles sur le Frey lab affinity propagation page.

2

Bien que K-Means++ ne résoudra pas le problème en une seule fois, il tend à donner de meilleurs résultats lorsqu'il est exécuté N fois (par rapport à l'exécution de l'algorithme K-Means original N fois).

+0

Oui, j'ai lu sur le kMeans ++ algo sur le wiki mais je n'ai pas vraiment compris comment les clusters initiaux ont été initiés .. – Theodor

+0

Essayez ce lien. http://ilpubs.stanford.edu:8090/778/1/2006-13.pdf – rwong

3

Je ne dirais pas que c'est un problème facile. En fait, l'article de Wikipédia sur «k-means clustering» donne une image assez sombre de la complexité de calcul.

Si vous voulez être libre des redémarrages aléatoires (en fonction de la supposition initiale), un compromis est l'algorithme "global k-means"; le code papier et matlab peut être trouvé ici: http://lear.inrialpes.fr/~verbeek/software.php