Je tente d'appliquer k-means sur un ensemble de points de données de grande dimension (environ 50 dimensions) et je me demandais s'il existait des implémentations permettant de trouver le nombre optimal de grappes.
Je me souviens avoir lu quelque part qu'un algorithme utilise généralement cette méthode pour maximiser la distance entre les groupes et minimiser la distance intra-groupe, mais je ne me souviens pas où j'ai vu cela. Ce serait formidable si quelqu'un peut m'indiquer des ressources sur ce sujet. J'utilise SciPy pour k-means actuellement, mais toute bibliothèque liée serait bien aussi.
S'il existe d'autres moyens d'obtenir le même algorithme, ou un meilleur, veuillez me le faire savoir.
Une approche est validation croisée .
Essentiellement, vous choisissez un sous-ensemble de vos données et le regroupez en k clusters, puis vous vous demandez comment il le regroupe, par rapport au reste des données: assignez-vous des points de données aux mêmes appartenances de cluster, ou tombent-ils dans différents groupes?
Si les appartenances sont à peu près les mêmes, les données s'intègrent bien dans k clusters. Sinon, vous essayez un autre k .
En outre, vous pouvez effectuer une PCA ( analyse en composantes principales ) afin de réduire vos 50 dimensions à un nombre plus facile à traiter. Si une analyse PCA suggère que la majeure partie de votre variance provient, par exemple, de 4 dimensions sur 50, vous pouvez choisir k sur cette base, pour explorer la manière dont les appartenances à la grappe sont attribuées.
Jetez un coup d’œil à cette page wikipedia pour déterminer le nombre de grappes dans un ensemble de données .
Aussi, vous voudrez peut-être essayer Clusterage hiérarchique par agglomération out. Cette approche n'a pas besoin de connaître le nombre de clusters, elle formera progressivement des clusters de cluster jusqu'à ce qu'il n'en reste plus qu'un. Cette technique existe également dans SciPy ( scipy.cluster.hierarchy ).
Une approche intéressante est celle de accumulation de preuves par Fred et Jain. Ceci est basé sur la combinaison de plusieurs exécutions de k-moyennes avec un grand nombre de clusters, en les agrégeant dans une solution globale. Les aspects intéressants de l’approche incluent que le nombre de grappes est déterminé dans le processus et que les grappes finales ne doivent pas nécessairement être sphériques.
Il existe des visualisations qui devraient indiquer de bons paramètres. Pour k-means, vous pouvez visualiser plusieurs exécutions avec k différents en utilisant Graphgrams (voir le package graphgram de WEKA - à obtenir de préférence par le gestionnaire de package ou ici . Une introduction et des exemples sont également disponibles ici .
Une façon de le faire est d'exécuter k-means avec k grand (beaucoup plus grand que ce que vous pensez être le nombre correct), disons 1000. puis, en utilisant l'algorithme de décalage moyen sur ces 1000 points (le décalage moyen utilise toutes les données, mais vous ne "déplacerez" que ces 1000 points). le décalage moyen trouvera alors la quantité de grappes. Exécuter un décalage moyen sans les k-moyennes avant est une possibilité, mais il est tout simplement trop lent habituellement O (N ^ 2 * # étapes), donc exécuter k-moyennes avant accélérera les choses: O (NK# étapes)
Vous devez également vous assurer que chaque dimension est en réalité indépendante. Beaucoup de jeux de données multidimensionnels ont plusieurs représentations de la même chose.
Ce n'est pas faux de les avoir dans vos données. Il est faux d'utiliser plusieurs versions de la même chose comme support pour un argument de cluster.
Si le numéro de cluster est inconnu, pourquoi ne pas utiliser plutôt le clustering hiérarchique?
Au début, chaque groupe isolé est un groupe, puis tous les deux groupes 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 classification hiérarchique peut effectuer un "K" approprié pour vos données.