k- 평균의 갭 통계가 왜 두 군집이 있는데도 하나의 군집을 제안합니까?


18

K- 평균을 사용하여 데이터를 클러스터링하고 "최적의"클러스터 번호를 제안하는 방법을 찾고있었습니다. 갭 통계는 좋은 클러스터 번호를 찾는 일반적인 방법 인 것 같습니다.

어떤 이유로 든 최적의 클러스터 번호로 1을 반환하지만 데이터를 볼 때 2 개의 클러스터가 있음이 분명합니다.

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

이것이 R에서 간격을 부르는 방법입니다.

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

결과 세트 :

> 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

내가 잘못하고 있거나 좋은 클러스터 번호를 얻는 더 좋은 방법을 알고 있습니까?

답변:


37

클러스터링은 무엇보다도 규모에 따라 다릅니다 . 이 문제에 대한 논의는 ( 특히 ) 언제 데이터를 중앙 집중화 하고 표준화해야합니까?를 참조하십시오 . PCA 공분산이나 상관 관계에? .

다음은 1 : 1 종횡비로 그린 데이터이며 두 변수의 스케일이 얼마나 다른지 보여줍니다.

그림 1

오른쪽에 간격 통계 그림은 수직 세그먼트로 그려진 표준 오류와 파란색 점선으로 표시된 최적의 k 값을 갖는 군집 수 ( )로 통계를 표시합니다. 도움 에 따르면케이케이clusGap

케이에프(케이)

케이=1

그림 2

케이=2케이{1,2,,4,5}케이=2케이케이=1케이케이=2. 여기에는 일반적인 방법 만 설명하기 위해 여기에 표시되어 있습니다.


다음은 R이러한 수치를 생성하는 코드입니다. 데이터는 질문에 표시된 것과 대략 일치합니다.

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

설명 주셔서 감사합니다. Btw : 격차 통계와 같은 다른 클러스터 메트릭을 알고 있습니까? 어떤 것을 찾았지만 어떤 것이 일반적으로 k- 평균과 함께 사용되는지 모르겠습니다.
MikeHuber

+1. 매우 훌륭한 데모이며 동일한 데이터를 얻기 위해 OP의 수치를 디지털화 한 것처럼 보입니다.
amoeba는

3
@amoeba 나는 산점도를 눈여겨보고 여기에 표시된 것과 정확히 좌표를 입력했습니다 (즉, 관련된 숫자는 내 자신의 손가락이었습니다 :-)). 때로는 가장 간단한 방법이 효율적입니다.
whuber

격차 통계를 사용하여 단일 1 차원 숫자 형 배열에서 군집 수를 찾을 수 있습니까?
user1971988

xyxy <- xy[, 1, drop=FALSE]n×1R(xi)(x나는,0)

9

xyK=1K>1귀무 가설을 기각 할 수 없다고해서 그것이 사실이되는 것은 아닙니다 . GAP 통계를 설명하는 방법 론적 논문 은 기술적 세부 사항을 더 자세히 확인하려는 경우 온라인으로 제공 됩니다.

k2×2k

kK=2


+1 줄거리를주의 깊게 읽어 잠재적 인 문제를 보았습니다. Hastie의 논문 링크는 귀하의 답변을 환영합니다.
whuber

@ whuber : 우리는 저울에 대해이 토론을 했습니까? :)
usεr11852는 Reinstate Monic

내가 연결하지 않은 것은 다른 맥락이었습니다 ....
whuber

실제로는 다른 맥락이었습니다. 나는 거기에 "비늘"과 "비늘"이 있기 때문에 당신에게 그것을 언급했습니다.
usεr11852는

0

원래 포스터와 같은 문제가있었습니다. R 문서는 현재 d.power = 1의 원래 및 기본 설정이 잘못되어 d.power로 대체되어야한다고 말합니다. "기본 d.power = 1은"역사적 "R 구현에 해당하지만 d.power = 2는 Tibshirani 등이 제안한 내용에 해당합니다. 이것은 2016-02 년 Juan Gonzalez가 발견했습니다. "

결과적으로 d.power = 2를 변경하면 문제가 해결되었습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.