Pourquoi la statistique de l'écart pour les moyennes k suggère-t-elle un cluster, même s'il y en a évidemment deux?

18

J'utilise K-means pour regrouper mes données et je cherchais un moyen de suggérer un numéro de cluster "optimal". Les statistiques sur les écarts semblent être un moyen courant de trouver un bon numéro de cluster.

Pour une raison quelconque, il renvoie 1 comme numéro de cluster optimal, mais quand je regarde les données, il est évident qu'il y a 2 clusters:

! [1] (http://i60.tinypic.com/28bdy6u.jpg)

Voici comment j'appelle gap dans R:

gap <- clusGap(data, FUN=kmeans, K.max=10, B=500)
with(gap, maxSE(Tab[,"gap"], Tab[,"SE.sim"], method="firstSEmax"))

L'ensemble de résultats:

> Number of clusters (method 'firstSEmax', SE.factor=1): 1
          logW   E.logW           gap    SE.sim
[1,]  5.185578 5.085414 -0.1001632148 0.1102734
[2,]  4.438812 4.342562 -0.0962498606 0.1141643
[3,]  3.924028 3.884438 -0.0395891064 0.1231152
[4,]  3.564816 3.563931 -0.0008853886 0.1387907
[5,]  3.356504 3.327964 -0.0285393917 0.1486991
[6,]  3.245393 3.119016 -0.1263766015 0.1544081
[7,]  3.015978 2.914607 -0.1013708665 0.1815997
[8,]  2.812211 2.734495 -0.0777154881 0.1741944
[9,]  2.672545 2.561590 -0.1109558011 0.1775476
[10,] 2.656857 2.403220 -0.2536369287 0.1945162

Suis-je en train de faire quelque chose de mal ou quelqu'un connaît-il une meilleure façon d'obtenir un bon numéro de cluster?

MikeHuber
la source

Réponses:

37

Le regroupement dépend entre autres de l' échelle . Pour des discussions sur cette question, voir ( entre autres ) Quand devez-vous centrer et normaliser les données? et PCA sur la covariance ou la corrélation? .

Voici vos données dessinées avec un rapport d'aspect de 1: 1, révélant à quel point les échelles des deux variables diffèrent:

Figure 1

À sa droite, le tracé des statistiques d'écart montre les statistiques par nombre de clusters ( ) avec des erreurs standard dessinées avec des segments verticaux et la valeur optimale de marquée avec une ligne bleue en pointillés verticale. Selon l' aide,kkkclusGap

La méthode par défaut "firstSEmax" recherche le plus petit tel que sa valeur ne soit pas à plus d'une erreur standard du premier maximum local.f ( k )kF(k)

D'autres méthodes se comportent de manière similaire. Ce critère ne fait ressortir aucune des statistiques sur les écarts, ce qui donne une estimation de .k=1

Le choix de l'échelle dépend de l'application, mais un point de départ par défaut raisonnable est une mesure de la dispersion des données, comme le MAD ou l'écart type. Ce graphique répète l'analyse après recentrage à zéro et mise à l'échelle pour faire un écart-type unitaire pour chaque composant et :buneb

Figure 2

k { 1 , 2 , 3 , 4 , 5 }k=2k{1,2,3,4,5}k=2kk=1kk=2


Voici le Rcode pour produire ces figures. Les données correspondent approximativement à celles présentées dans la question.

library(cluster)
xy <- matrix(c(29,391, 31,402, 31,380, 32.5,391, 32.5,360, 33,382, 33,371,
        34,405, 34,400, 34.5,404, 36,343, 36,320, 36,303, 37,344,
        38,358, 38,356, 38,351, 39,318, 40,322, 40, 341), ncol=2, byrow=TRUE)
colnames(xy) <- c("a", "b")
title <- "Raw data"
par(mfrow=c(1,2))
for (i in 1:2) {
  #
  # Estimate optimal cluster count and perform K-means with it.
  #
  gap <- clusGap(xy, kmeans, K.max=10, B=500)
  k <- maxSE(gap$Tab[, "gap"], gap$Tab[, "SE.sim"], method="Tibs2001SEmax")
  fit <- kmeans(xy, k)
  #
  # Plot the results.
  #
  pch <- ifelse(fit$cluster==1,24,16); col <- ifelse(fit$cluster==1,"Red", "Black")
  plot(xy, asp=1, main=title, pch=pch, col=col)
  plot(gap, main=paste("Gap stats,", title))
  abline(v=k, lty=3, lwd=2, col="Blue")
  #
  # Prepare for the next step.
  #
  xy <- apply(xy, 2, scale)
  title <- "Standardized data"
}
whuber
la source
bien merci pour l'explication. Btw: Connaissez-vous une autre métrique de cluster comme les statistiques d'écart? J'en ai trouvé, mais je ne sais pas lequel est généralement utilisé avec k-means?
MikeHuber
+1. Très belle démonstration, et il est impressionnant que vous sembliez avoir numérisé le chiffre d'OP pour obtenir les mêmes données.
amibe dit Réintégrer Monica
3
@amoeba J'ai regardé le nuage de points et tapé les coordonnées exactement comme vous le voyez ici (c'est-à-dire que les chiffres impliqués étaient mes propres doigts :-)). Parfois, l'approche la plus simple est efficace.
whuber
La statistique d'écart peut-elle être utilisée pour trouver le nombre de grappes dans un seul tableau 1-d de valeurs numériques?
user1971988
xyxy <- xy[, 1, drop=FALSE]n×1R(Xje)(Xje,0)
9

xyK=1K>1l'incapacité de rejeter l'hypothèse nulle ne la rend pas vraie . Le document méthodologique décrivant la statistique GAP est disponible en ligne si vous souhaitez vérifier plus les détails techniques.

k2×2k

kK=2

usεr11852 dit Reinstate Monic
la source
+1 Vous avez vu le problème potentiel en lisant attentivement l'intrigue: bravo! Le lien vers l'article de Hastie est également le bienvenu pour votre réponse.
whuber
@whuber: Nous avons eu cette discussion sur les balances, n'est-ce pas? :)
usεr11852 dit Réintégrer Monic
C'était un contexte tellement différent que je n'ai pas fait le lien ....
whuber
C'était en effet un contexte différent; Je vous l'ai mentionné simplement parce qu'il y avait des "échelles" ici, et des "échelles" ici.
usεr11852 dit Réintégrer Monic
0

J'ai eu le même problème que l'affiche originale. La documentation R indique actuellement que le réglage d'origine et par défaut de d.power = 1 était incorrect et devrait être remplacé par d.power: "La valeur par défaut, d.power = 1, correspond à l'implémentation R" historique ", tandis que d.power = 2 correspond à ce que Tibshirani et al avaient proposé. Cela a été trouvé par Juan Gonzalez, en 2016-02. "

Par conséquent, changer d.power = 2 a résolu le problème pour moi.

https://www.rdocumentation.org/packages/cluster/versions/2.0.6/topics/clusGap

mikki
la source