À propos de k-means en particulier, vous pouvez utiliser les statistiques Gap. Fondamentalement, l’idée est de calculer la qualité d’une mesure de classification basée sur la dispersion moyenne comparée à une distribution de référence pour un nombre croissant de grappes. Plus d'informations peuvent être trouvées dans l'article original:
Tibshirani, R., Walther, G. et Hastie, T. (2001). Estimation du nombre de grappes dans un ensemble de données via la statistique des écarts . JR Statist. Soc. B, 63 (2): 411-423.
La réponse que j'ai fournie à une question connexe met en évidence d'autres indices de validité généraux pouvant être utilisés pour vérifier si un ensemble de données donné présente une sorte de structure.
Lorsque vous ne savez pas ce que vous attendez s'il n'y a que du bruit, une bonne approche consiste à utiliser le rééchantillonnage et à étudier la stabilité des grappes. En d'autres termes, rééchantillonnez vos données (via bootstrap ou en y ajoutant un petit bruit) et calculez la "proximité" des partitions résultantes, mesurée par les similitudes de Jaccard . En bref, cela permet d’estimer la fréquence avec laquelle des grappes similaires ont été récupérées dans les données. Cette méthode est facilement disponible dans le package fpc R en tant que clusterboot()
. Il prend en entrée des données brutes ou une matrice de distance et permet d'appliquer un large éventail de méthodes de classification (méthodes hiérarchiques, k-moyennes, floues). La méthode est discutée dans les références liées:
Hennig, C. (2007) Evaluation par grappes de la stabilité des grappes .
Statistiques de calcul et d'analyse de données , 52, 258-271.
Hennig, C. (2008) Point de dissolution et robustesse d'isolement: critères de robustesse pour les méthodes générales d'analyse par grappes . Journal of Multivariate Analysis , 99, 1154-1176.
Vous trouverez ci-dessous une petite démonstration avec l'algorithme k-means.
sim.xy <- function(n, mean, sd) cbind(rnorm(n, mean[1], sd[1]),
rnorm(n, mean[2],sd[2]))
xy <- rbind(sim.xy(100, c(0,0), c(.2,.2)),
sim.xy(100, c(2.5,0), c(.4,.2)),
sim.xy(100, c(1.25,.5), c(.3,.2)))
library(fpc)
km.boot <- clusterboot(xy, B=20, bootmethod="boot",
clustermethod=kmeansCBI,
krange=3, seed=15555)
Les résultats sont assez positifs dans cet ensemble de données artificiel (et bien structuré) puisqu’aucune des trois grappes ( krange
) n’a été dissoute entre les échantillons et que la similarité moyenne par Jaccard par grappe est> 0,95 pour toutes les grappes.
Vous trouverez ci-dessous les résultats sur les 20 échantillons bootstrap. Comme on peut le constater, les unités statistiques ont tendance à rester groupées dans le même groupe, à quelques exceptions près pour les observations intermédiaires.
Vous pouvez bien sûr étendre cette idée à n’importe quel indice de validité: choisissez une nouvelle série d’observations par bootstrap (avec remplacement), calculez votre statistique (par exemple, largeur de la silhouette, corrélation cophénétique, gamma de Hubert, dans la somme des carrés) les numéros de grappes (par exemple, 2 à 10), répétez 100 ou 500 fois et examinez le diagramme en boîte de vos statistiques en fonction du nombre de grappes.
Voici ce que j’obtiens avec le même jeu de données simulé, mais en utilisant la classification hiérarchique de Ward et en prenant en compte la corrélation cophénétique (qui évalue la qualité de la reproduction des informations de distance dans les partitions résultantes) et la largeur de la silhouette (mesure combinant l’homogénéité intra-grappe et séparation des grappes).
La corrélation cophénétique varie de 0,6267 à 0,7511 avec une valeur médiane de 0,7031 (500 échantillons bootstrap). La largeur de la silhouette semble être maximale quand on considère 3 groupes (médiane 0,8408, plage 0,7371-0,8769).