¿Por qué la estadística de brecha para k-means sugiere un grupo, aunque obviamente hay dos de ellos?

18

Estoy usando K-means para agrupar mis datos y estaba buscando una manera de sugerir un número de clúster "óptimo". Las estadísticas de brecha parecen ser una forma común de encontrar un buen número de clúster.

Por alguna razón, devuelve 1 como número de clúster óptimo, pero cuando miro los datos es obvio que hay 2 clústeres:

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

Así es como llamo gap en R:

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

El conjunto de resultados:

> 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

¿Estoy haciendo algo mal o alguien conoce una mejor manera de obtener un buen número de clúster?

MikeHuber
fuente

Respuestas:

37

La agrupación depende de la escala , entre otras cosas. Para discusiones sobre este tema, vea ( entre otras cosas ) ¿ Cuándo debe centrar y estandarizar los datos? y PCA en covarianza o correlación? .

Aquí están sus datos dibujados con una relación de aspecto 1: 1, que revela cuánto difieren las escalas de las dos variables:

Figura 1

A su derecha, la gráfica de las estadísticas de huecos muestra las estadísticas por número de grupos ( ) con errores estándar dibujados con segmentos verticales y el valor óptimo de k marcado con una línea azul discontinua vertical. Según la ayuda,kkclusGap

kf(k)

k=1

ab

Figura 2

k=2k{1,2,3,4,5}k=2kk=1kk=2. Aquí se muestran solo para ilustrar el método general.


Aquí hay un Rcódigo para producir estas figuras. Los datos coinciden aproximadamente con los que se muestran en la pregunta.

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
fuente
Muy bien, gracias por la explicación. Por cierto: ¿Conoces alguna otra métrica de clúster como estadísticas de brecha? Encontré algunos, pero no sé cuál se usa generalmente con k-means.
MikeHuber
+1. Muy buena demostración, y es impresionante que parezca haber digitalizado la figura de OP para obtener los mismos datos.
ameba dice Reinstate Monica
3
@amoeba Observé el diagrama de dispersión y escribí las coordenadas exactamente como ves aquí (es decir, los dígitos involucrados eran mis propios dedos :-)). A veces, el enfoque más simple es eficiente.
whuber
¿Se puede usar el estadístico gap para encontrar el número de clústeres en una sola matriz 1-d de valores numéricos?
user1971988
xyxy <- xy[, 1, drop=FALSE]n×1R(xi)(xi,0)
9

xyK=1K>1la incapacidad de rechazar la hipótesis nula no la hace verdadera . El documento metodológico que describe la estadística GAP está disponible en línea si desea consultar más detalles técnicos.

k2×2k

kK=2

usεr11852 dice Reinstate Monic
fuente
+1 Usted vio el problema potencial al leer cuidadosamente la trama: ¡bien hecho! El enlace al documento de Hastie es un apoyo bienvenido a su respuesta también.
whuber
@whuber: Tuvimos esta discusión sobre escalas, ¿no? :)
usεr11852 dice Reinstate Monic
Era un contexto tan diferente que no hice la conexión ...
whuber
Era un contexto diferente de hecho; Te lo mencioné solo porque era "escalas" allí, y "escalas" aquí.
usεr11852 dice Reinstate Monic
0

Tuve el mismo problema que el póster original. La documentación de R actualmente dice que la configuración original y predeterminada de d.power = 1 era incorrecta y debería reemplazarse por d.power: "El valor predeterminado, d.power = 1, corresponde a la implementación R" histórica ", mientras que d.power = 2 corresponde a lo que Tibshirani et al propusieron. Esto fue encontrado por Juan González, en 2016-02 ".

En consecuencia, cambiar d.power = 2 resolvió el problema para mí.

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

Mikki
fuente