明らかに2つあるにもかかわらず、k-meansのギャップ統計が1つのクラスターを示唆するのはなぜですか?


18

K-meansを使用してデータをクラスター化し、「最適な」クラスター番号を提案する方法を探していました。ギャップ統計は、適切なクラスター番号を見つける一般的な方法のようです。

何らかの理由で最適なクラスター番号として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

クラスタリングは、とりわけscale依存します。この問題の説明については、(特にデータを中央に配置して標準化する必要がある場合を参照してくださいそしてPCA共分散または相関の?

以下に、1:1のアスペクト比で描画さ​​れたデータを示します。2つの変数のスケールがどれだけ異なるかがわかります。

図1

右側のギャップ統計のプロットは、クラスターの数()による統計と、垂直セグメントで描かれた標準誤差、および青い破線でマークされたの最適値を示しています。ヘルプによると、kkkclusGap

デフォルトのメソッド「firstSEmax」は、値が最初のローカル最大値から1標準誤差を超えないように最小探します。f k kfk

他のメソッドも同様に動作します。この基準により、ギャップ統計値が目立たなくなり、推定値になります。k=1

スケールの選択はアプリケーションによって異なりますが、妥当なデフォルトの出発点は、MADや標準偏差などのデータの分散の尺度です。このプロットは、ゼロに再センタリングし、各コンポーネントおよび単位標準偏差を作成するために再スケーリングした後、分析を繰り返します。bab

図2

K-手段溶液を左側のデータの散布図でシンボルタイプと色を変化させることによって示されています。集合、は右のギャップ統計プロットで明らかに好まれています。これは最初の局所最大値であり、小さいの統計値です(つまり、)は大幅に低くなります。値が大きいと、このような小さなデータセットにはオーバーフィットする可能性が高く、よりも大幅に優れているものはありません。ここでは、一般的な方法を説明するためにのみ示しています。 のk { 1 2 3 4 5 } 、K = 2 Kk=2k{12345}k=2kk=1kk=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-meansで通常どれが使用されるかわかりませんか?
MikeHuber

+1。非常に素晴らしいデモンストレーションであり、同じデータを取得するためにOPの図をデジタル化したように見えるのは印象的です。
アメーバは、Reinstate Monica

3
@amoeba散布図を見て、ここに表示されているとおりに正確に座標を入力しました(つまり、関連する数字は自分の指でした:-))。時には、最も簡単なアプローチが効率的です。
whuber

ギャップ統計を使用して、数値の単一の1次元配列でクラスターの数を見つけることができますか?
-user1971988

@ user1971988試してみませんか?xyコードをxy <- xy[, 1, drop=FALSE](配列にするために)で置き換えます。を使用していない場合は、このちょっとした実験を検討してください。距離を変更せずに 1次元配列を2次元配列とみなすことができます。後者をクラスタリングすると、前者がクラスター化されます。x ix i0 n×1Rバツバツ0
whuber

9

GAP統計の使用に関して間違ったことを理解していないと思います。あなたは、視覚化のデータの規模によって部分的に誤解されていると思います。あなたは二つのクラスタを実際xの方向はに比べてかなり小さいy方向。それに基づいて、2つの細長いクラスターが期待されます。それでも、1つの分散モードが他のモードを支配しているように見えます。GAP統計では、単一のコンポーネント()を含むヌルモデルを想定し、代替モデルに対してこのモデルを拒否しようとします。観察するのは、nullを拒否できないことです。帰無仮説を棄却できないからいっ、それが成り立たないことに注意しくださいK > 1K=1K>1。技術的な詳細をさらに確認したい場合、GAP統計を説明する方法論ペーパーをオンラインで入手できます

Gaussian Mixture Model(GMM- -meansの一般化、詳細についてはこのスレッドを参照)を使用してモデルを実行します。その場合もGAP統計は単一のクラスターを示唆しています。また、BICは単一のクラスターを提案しました。AICは4つのクラスター(!)を提案しますが、これは明らかに過剰になり始める兆候です。使用されるサンプルはそれほど大きくありません。21のポイントがあり、1つの分散モードが他の分散モードより優勢です。わずか21の2次元点を持つ2つの2次元クラスター(つまり、2つの2次元平均と2つの共分散行列に適合)を持つことは少しばかりです。:)(の場合、共分散行列はより構造化されています(共分散は見ていません)が、ここではそのことに焦点を合わせません。)2 × 2 kk2×2k

編集:ちょうど完全のために:@whuberは、2つのクラスタが平均で1つが彼のデータを標準化した場合に最適として表示されることを示しました。GMM近似に適用されるGAP基準は、データを標準化する場合、クラスターの最適数としてを与えます。K = 2kK=2


+1プロットを注意深く読むことで潜在的な問題を見ました:よくできました!Hastieの論文へのリンクも、あなたの答えへの歓迎されたサポートです。
whuber

@whuber:スケールについてこの議論をしましたよね?:)
usεr11852は、Reinstate Monic

それは私が接続を確立しなかったような異なるコンテキストでした...。
whuber

それは実際に異なるコンテキストでした。そこに「スケール」があり、「スケール」がここにあったという理由だけで、私はあなたにそれを言及しました。
usεr11852が復活モニック言う

0

元のポスターと同じ問題がありました。Rのドキュメントでは、現在、d.power = 1の元のデフォルト設定は間違っていて、d.powerに置き換える必要があると述べています。「デフォルトのd.power = 1は、「歴史的な」R実装に対応し、 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.