Kmeans sans connaître le nombre de clusters? [dupliquer]
cette question a déjà une réponse ici:
- Comment déterminer k en utilisant k-means clustering? 15 réponses
j'essaie d'appliquer le K-means sur un ensemble de points de données de haute Dimension (environ 50 dimensions) et je me demande s'il y a des implémentations qui trouvent le nombre optimal de grappes.
je me souviens avoir lu quelque part que la façon dont un algorithme fait généralement ceci est telle que la distance inter-cluster est maximisée et la distance intra-cluster est minimisée, mais je ne me souviens pas où j'ai vu cela. Ce serait génial si quelqu'un pouvait m'indiquer toutes les ressources qui en parlent. J'utilise SciPy pour K-means actuellement, mais toute bibliothèque connexe serait très bien aussi.
S'il existe d'autres moyens de réaliser le même ou un meilleur algorithme, s'il vous plaît laissez-moi savoir.
7 réponses
Une approche cross-validation .
essentiellement, vous choisissez un sous-ensemble de vos données et de le regrouper en k clusters, et vous demandez comment bien il clusters, par rapport au reste des données: vous assignez des points de données aux mêmes adhésions de cluster, ou ils tombent dans différents clusters?
si les adhésions sont à peu près les mêmes, les données concordent bien avec k clusters. Sinon, vous essayez un autre k .
aussi, vous pourriez faire PCA ( analyse des composants principaux ) pour réduire vos 50 dimensions à un nombre plus tractable. Si une exécution PCA suggère que la plus grande partie de votre variance provient, disons, de 4 sur les 50 dimensions, alors vous pouvez choisir k sur cette base, pour explorer comment les quatre adhésions cluster sont assignés.
jetez un oeil à cette page de wikipedia sur la détermination du nombre de grappes dans un ensemble de données .
vous pouvez aussi essayer groupement hiérarchique D'agglomération out. Cette approche n'a pas besoin de connaître le nombre de grappes, elle formera progressivement des grappes de grappes jusqu'à ce qu'il n'en existe qu'une seule. Cette technique existe aussi en SciPy ( scipy.cluster.hiérarchie ).
une approche intéressante est celle de evidence accumulation par Fred et Jain. Ceci est basé sur la combinaison de plusieurs passages de K-means avec un grand nombre de clusters, en les agrégeant dans une solution globale. Les aspects intéressants de l'approche comprennent que le nombre de grappes est déterminé dans le processus et que les grappes finales ne doivent pas être sphériques.
il y a une visualisation qui devrait indiquer de bons paramètres. Pour k-signifie que vous pouvez visualiser plusieurs passages avec différents k en utilisant Graphgrams (voir le paquet WEKA graphgram - mieux obtenu par le gestionnaire de paquets ou ici ). Une introduction et des exemples peuvent également être trouvés ici .
une façon de le faire est d'exécuter k-signifie avec grand k (beaucoup plus grand que ce que vous pensez est le nombre correct), disons 1000. ensuite, lancer l'algorithme mean-shift sur ces 1000 points (mean shift utilise l'ensemble des données mais vous ne "déplacerez" ces 1000 points). décalage trouverez le montant de grappes. Exécuter le déplacement moyen sans les K-moyens avant est une possibilité mais il est juste trop lent habituellement O (N^2*#steps), donc exécuter les k-moyens avant va accélérer les choses: O (N K #étapes)
, Vous devez également vous assurer que chaque dimension est en fait indépendante. Beaucoup de soi-disant ensembles de données multidimensionnels ont des représentations multiples de la même chose.
C'est pas mal d'avoir ces dans vos données. Il est erroné d'utiliser plusieurs versions de la même chose que le support d'un argument cluster.
si le numéro de cluster est inconnu, pourquoi ne pas utiliser le Clustering hiérarchique à la place?
au début, chaque individu isolé est un cluster, puis tous les deux clusters seront fusionnés si leur distance est inférieure à un seuil, l'algorithme se terminera lorsqu'il n'y aura plus de fusion.
l'algorithme de regroupement hiérarchique peut effectuer un" K " approprié pour vos données.