Dlaczego statystyki luk dla k-średnich sugerują jeden klaster, chociaż oczywiście są dwa z nich?

18

Używam K-średnich do klastra moich danych i szukałem sposobu, aby zasugerować „optymalny” numer klastra. Statystyki luk wydają się być powszechnym sposobem na znalezienie dobrego numeru klastra.

Z jakiegoś powodu zwraca 1 jako optymalną liczbę klastrów, ale kiedy patrzę na dane, widać, że istnieją 2 klastry:

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

Tak nazywam lukę w R:

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

Zestaw wyników:

> 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

Czy robię coś źle, czy ktoś zna lepszy sposób na uzyskanie dobrego numeru klastra?

MikeHuber
źródło

Odpowiedzi:

37

Grupowanie zależy między innymi od skali . Dyskusje na ten temat można znaleźć ( między innymi ) Kiedy należy wyśrodkować i ustandaryzować dane? i PCA na temat kowariancji lub korelacji? .

Oto twoje dane narysowane ze współczynnikiem proporcji 1: 1, pokazującym, jak bardzo różnią się skale dwóch zmiennych:

Rycina 1

Po prawej stronie wykres statystyki odstępu pokazuje statystyki według liczby skupień ( ) ze standardowymi błędami narysowanymi pionowymi segmentami i optymalną wartością k oznaczoną pionową przerywaną niebieską linią. Według pomocykkclusGap

kfa(k)

k=1

zab

Rysunek 2

k=2)k{1,2),3),4,5}k=2)kk=1kk=2). Pokazano je tutaj tylko w celu zilustrowania ogólnej metody.


Oto Rkod do tworzenia tych liczb. Dane w przybliżeniu odpowiadają tym przedstawionym w pytaniu.

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
źródło
w porządku dzięki za wyjaśnienie. Btw: Czy znasz jakieś inne wskaźniki klastrowe, takie jak statystyki luk? Znalazłem kilka, ale nie wiem, które są zwykle używane z k-średnich?
MikeHuber,
+1. Bardzo ładna demonstracja i imponujące, że zdaje się, że zdigitalizowano liczbę OP, aby uzyskać te same dane.
ameba mówi Przywróć Monikę
3
@amoeba Spojrzałem na wykres rozrzutu i wpisałem współrzędne dokładnie tak, jak tu widzicie (to znaczy, że cyfry były moje własne palce :-)). Czasami najprostsze podejście jest skuteczne.
whuber
Czy można użyć statystyki odstępu do znalezienia liczby klastrów w pojedynczej tablicy wartości liczbowych 1-d?
user1971988 27.04.16
xyxy <- xy[, 1, drop=FALSE]n×1R(xja)(xja,0)
9

xyK.=1K.>1niemożność odrzucenia hipotezy zerowej nie czyni jej prawdziwą . Artykuł metodyczny opisujący statystyki GAP jest dostępny online, jeśli chcesz sprawdzić szczegóły techniczne.

k2)×2)k

kK.=2)

usεr11852 mówi Reinstate Monic
źródło
+1 Widziałeś potencjalny problem, uważnie czytając fabułę: dobra robota! Link do artykułu Hastie jest również mile widzianym wsparciem dla twojej odpowiedzi.
whuber
@whuber: Rozmawialiśmy o skalach, prawda? :)
usεr11852 mówi Przywróć Monic
To był taki inny kontekst , że nie nawiązałem połączenia ...
whuber
To był rzeczywiście inny kontekst; Wspomniałem wam o tym tylko dlatego, że były tam „łuski” i „łuski” tutaj.
usεr11852 mówi: Przywróć Monic
0

Miałem ten sam problem, co oryginalny plakat. Dokumentacja R mówi obecnie, że oryginalne i domyślne ustawienie d.power = 1 było niepoprawne i powinno zostać zastąpione przez d.power: „Domyślne, d.power = 1, odpowiada„ historycznej ”implementacji R, podczas gdy d.power = 2 odpowiada temu, co zaproponował Tibshirani i in. Zostało to znalezione przez Juana Gonzaleza w latach 2016-02. ”

W związku z tym zmiana d.power = 2 rozwiązała problem dla mnie.

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

mikki
źródło