Mengapa statistik gap untuk k-means menyarankan satu klaster, meskipun jelas ada dua klaster?

18

Saya menggunakan K-means untuk mengelompokkan data saya dan sedang mencari cara untuk menyarankan nomor cluster "optimal". Statistik gap tampaknya menjadi cara umum untuk menemukan nomor cluster yang baik.

Untuk beberapa alasan ia mengembalikan 1 sebagai nomor cluster optimal, tetapi ketika saya melihat data jelas bahwa ada 2 cluster:

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

Ini adalah bagaimana saya memanggil celah di R:

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

Hasil yang ditetapkan:

> 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

Apakah saya melakukan sesuatu yang salah atau apakah seseorang tahu cara yang lebih baik untuk mendapatkan nomor cluster yang baik?

MikeHuber
sumber

Jawaban:

37

Clustering tergantung pada skala , antara lain. Untuk diskusi tentang masalah ini lihat ( antara lain ) Kapan Anda harus memusatkan dan menstandardisasi data? dan PCA tentang kovarian atau korelasi? .

Berikut adalah data Anda yang diambil dengan rasio aspek 1: 1, mengungkapkan seberapa besar perbedaan dari dua variabel:

Gambar 1

Di sebelah kanannya, plot statistik gap menunjukkan statistik berdasarkan jumlah cluster ( ) dengan kesalahan standar yang digambar dengan segmen vertikal dan nilai optimal ditandai dengan garis biru putus-putus vertikal. Menurut bantuan itu,kkkclusGap

Metode default "firstSEmax" mencari terkecil sehingga nilainya tidak lebih dari 1 kesalahan standar dari maksimum lokal pertama.f ( k )kf(k)

Metode lain berperilaku serupa. Kriteria ini tidak menyebabkan statistik gap menonjol, sehingga menghasilkan perkiraan .k=1

Pilihan skala tergantung pada aplikasi, tetapi titik awal default yang masuk akal adalah ukuran dispersi data, seperti MAD atau standar deviasi. Plot ini mengulangi analisis setelah memasukkan kembali ke nol dan mengubah ukuran untuk membuat deviasi standar satuan untuk setiap komponen dan :bSebuahb

Gambar 2

Solusi K-means ditunjukkan dengan memvariasikan jenis simbol dan warna di sebar data di sebelah kiri. Di antara set , jelas disukai dalam plot statistik gap di sebelah kanan: ini adalah maksimum lokal pertama dan statistik untuk lebih kecil (yaitu, ) jauh lebih rendah. Nilai yang lebih besar dari cenderung sesuai untuk set data kecil seperti itu, dan tidak ada yang secara signifikan lebih baik daripada . Mereka ditampilkan di sini hanya untuk menggambarkan metode umum. k { 1 , 2 , 3 , 4 , 5 } k = 2 k k = 1 k k = 2k=2k{1,2,3,4,5}k=2kk=1kk=2


Berikut adalah Rkode untuk menghasilkan angka-angka ini. Data kira-kira cocok dengan yang ditunjukkan dalam pertanyaan.

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
sumber
oke terima kasih atas penjelasannya. Btw: Apakah Anda tahu ada metrik klaster lain seperti statistik gap? Saya menemukan beberapa, tetapi saya tidak tahu yang mana yang biasanya digunakan dengan k-means?
MikeHuber
+1. Demonstrasi yang sangat bagus, dan mengesankan bahwa Anda tampaknya telah mendigitalkan angka OP untuk mendapatkan data yang sama.
Amuba mengatakan Reinstate Monica
3
@amoeba saya melihat scatterplot dan mengetikkan koordinat persis seperti yang Anda lihat di sini (yaitu, digit yang terlibat adalah jari saya sendiri :-)). Terkadang pendekatan yang paling sederhana adalah efisien.
whuber
Dapatkah statistik gap digunakan untuk menemukan jumlah cluster dalam satu larik nilai numerik 1-d?
user1971988
xyxy <- xy[, 1, drop=FALSE]n×1R(xsaya)(xsaya,0)
9

xyK=1K>1ketidakmampuan untuk menolak hipotesis nol tidak menjadikannya benar . Makalah metodologis yang menggambarkan statistik GAP tersedia secara online jika Anda ingin memeriksa rincian teknis lebih lanjut.

k2×2k

kK=2

usεr11852 kata Reinstate Monic
sumber
+1 Anda melihat masalah potensial dengan membaca plot dengan cermat: bagus sekali! Tautan ke makalah Hastie juga menyambut dukungan untuk jawaban Anda.
Whuber
@whuber: Kami sudah berdiskusi tentang timbangan, bukan? :)
usεr11852 mengatakan Reinstate Monic
Itu konteks yang berbeda sehingga saya tidak membuat koneksi ....
whuber
Itu memang konteks yang berbeda; Saya menyebutkannya kepada Anda hanya karena "timbangan" di sana, dan "timbangan" di sini.
usεr11852 mengatakan Reinstate Monic
0

Saya memiliki masalah yang sama dengan poster aslinya. Dokumentasi R saat ini mengatakan bahwa pengaturan asli dan default dari d.power = 1 tidak benar dan harus diganti oleh d.power: "Default, d.power = 1, sesuai dengan implementasi R" historis ", sedangkan d.power = 2 sesuai dengan apa yang diusulkan Tibshirani et al. Ini ditemukan oleh Juan Gonzalez, pada 2016-02. "

Akibatnya, mengubah d.power = 2 memecahkan masalah bagi saya.

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

mikki
sumber