Perché la statistica gap per k-medie suggerisce un cluster, anche se ce ne sono ovviamente due?


18

Sto usando K-means per raggruppare i miei dati e stavo cercando un modo per suggerire un numero di cluster "ottimale". Le statistiche sui gap sembrano essere un modo comune per trovare un buon numero di cluster.

Per qualche motivo restituisce 1 come numero di cluster ottimale, ma quando guardo i dati è ovvio che ci sono 2 cluster:

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

Ecco come chiamo gap in R:

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

Il set di risultati:

> 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

Sto facendo qualcosa di sbagliato o qualcuno conosce un modo migliore per ottenere un buon numero di cluster?

Risposte:


37

Il clustering dipende dalla scala , tra le altre cose. Per le discussioni su questo problema vedi ( tra l'altro ) Quando dovresti centrare e standardizzare i dati? e PCA sulla covarianza o sulla correlazione? .

Ecco i tuoi dati disegnati con un rapporto 1: 1, rivelando quanto differiscono le scale delle due variabili:

Figura 1

Alla sua destra, il grafico delle statistiche gap mostra le statistiche per numero di cluster ( ) con errori standard disegnati con segmenti verticali e il valore ottimale di k contrassegnato da una linea blu tratteggiata verticale. Secondo l' aiuto,KKclusGap

Kf(K)

K=1

un'B

figura 2

K=2K{1,2,3,4,5}K=2KK=1KK=2. Sono mostrati qui solo per illustrare il metodo generale.


Ecco il Rcodice per produrre queste cifre. I dati corrispondono approssimativamente a quelli mostrati nella domanda.

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"
}

va bene grazie per la spiegazione. Btw: conosci qualche altra metrica del cluster come le statistiche sul gap? Ne ho trovati alcuni, ma non so quale di solito viene usato con k-mean?
MikeHuber,

+1. Dimostrazione molto bella ed è impressionante che sembri aver digitalizzato la figura dell'OP per ottenere gli stessi dati.
ameba dice Ripristina Monica il

3
@amoeba Ho osservato il grafico a dispersione e ho digitato le coordinate esattamente come vedi qui (ovvero, le cifre coinvolte erano le mie dita :-)). A volte l'approccio più semplice è efficiente.
whuber

La statistica gap può essere utilizzata per trovare il numero di cluster in un singolo array 1-d di valori numerici?
user1971988

xyxy <- xy[, 1, drop=FALSE]n×1R(Xio)(Xio,0)

9

xyK=1K>1l'incapacità di respingere l'ipotesi nulla non la rende vera . Il documento metodologico che descrive la statistica GAP è disponibile online se si desidera controllare di più i dettagli tecnici.

K2×2K

KK=2


+1 Hai visto il potenziale problema leggendo attentamente la trama: ben fatto! Il link al documento di Hastie è anche il benvenuto supporto alla tua risposta.
whuber

@whuber: abbiamo avuto questa discussione sulle scale, no? :)
usεr11852 dice Reinstate Monic il

Era un contesto così diverso che non ho fatto la connessione ...
whuber

Era davvero un contesto diverso; Te l'ho detto solo perché c'erano "scale" lì e "scale" qui.
usεr11852 dice Reinstate Monic il

0

Ho avuto lo stesso problema del poster originale. La documentazione R attualmente afferma che l'impostazione originale e predefinita di d.power = 1 era errata e dovrebbe essere sostituita da d.power: "L'impostazione predefinita, d.power = 1, corrisponde all'implementazione R" storica ", mentre d.power = 2 corrisponde a quanto proposto da Tibshirani et al. Questo è stato trovato da Juan Gonzalez nel 2016-02. "

Di conseguenza, cambiando d.power = 2 ho risolto il problema per me.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.