K-means法(K平均法)を用いてクラスタリングする場合は、あらかじめクラスタ数を指定しなければならない。
このときのクラスタ数をどのように決めてよいか迷ったことはないだろうか。
ここでは、K-means法のクラスタ数を機械的に決定する方法をお伝えする。

K-means法のクラスタ数を機械的に決定するために用いるのが、Gap統計量である。
Gap統計量を用いたクラスタ数の決定のアイディアを簡単にご紹介すると、クラスタ数1、2、・・・と順に、一様分布から作成されたクラスタ内の距離の平均と元データのクラスタ内の距離の平均とを比べて、より密集しているクラスタ数を採用するという方法である。

詳しくは、Estimating the number of clusters in a data set via the gap statisticを参考にしてほしい。

ここからは、Rを用いて具体的に見ていこう。
まずは、clusterパッケージの読み込みと、ご説明するためのサンプルデータを作成する。
意図的に3つのクラスタができるようにデータを作成した。


> library(cluster)

> sample1 <- data.frame(x = rnorm(10, mean = 1, sd = 1), y = rnorm(10, mean = 1, sd = 1))
> sample2 <- data.frame(x = rnorm(10, mean = 5, sd = 1), y = rnorm(10, mean = 5, sd = 1))
> sample3 <- data.frame(x = rnorm(10, mean = 10, sd = 1), y = rnorm(10, mean = 10, sd = 1))
> sample <- rbind(sample1, sample2, sample3)
> plot(sample)

how-to-decide-number-of-clusters-in-r-1

このデータに対して、Gap統計量を求めてみる。
Gap統計量を求めるためには、clusGap関数を用いる。
下のコードのclusGap関数の引数は、次のような意味である。

  • sample:データ
  • kmenas:K-means法
  • K.max:クラスタ数の最大値
  • B:モンテカルロ法のブートストラップ回数
  • verborse:処理状況を表示するかどうか

> result <- clusGap(sample, kmeans, K.max = 10, B = 100, verbose = interactive())

Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 100)  [one "." per sample]:
.................................................. 50 
.................................................. 100 

処理が終わったら、結果の中身を見てみよう。


> result

Clustering Gap statistic ["clusGap"].
B=100 simulated reference sets, k = 1..10
 --> Number of clusters (method 'firstSEmax', SE.factor=1): 3
          logW   E.logW         gap     SE.sim
 [1,] 3.806407 3.629772 -0.17663555 0.06747599
 [2,] 3.062174 3.097019  0.03484477 0.06139314
 [3,] 2.453365 2.839130  0.38576490 0.07033063
 [4,] 2.327831 2.655896  0.32806576 0.07766857
 [5,] 2.209761 2.491554  0.28179274 0.09399472
 [6,] 2.107407 2.336471  0.22906381 0.09037798
 [7,] 1.998367 2.196959  0.19859206 0.09656801
 [8,] 1.778149 2.071716  0.29356688 0.11532498
 [9,] 1.681060 1.943485  0.26242534 0.10098396
[10,] 1.658722 1.821823  0.16310132 0.10548041

このとき、求めるクラスタ数kは

gap(k) ≧ gap(k+1) - SE.sim(k+1)

となる最小のkである。

clusGap関数の結果をみると、k=3であることが分かる。
このclusGap関数は、グラフ化することも容易で、グラフから読み解くこともできる。


> plot(result)

how-to-decide-number-of-clusters-in-r-2

このグラフから、求めるクラスタ数はk=3であることが分かる。

関連する記事

  • R言語 CRAN Task View:RグラフィカルモデルR言語 CRAN Task View:Rグラフィカルモデル CRAN Task View: Graphical Modelsの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Soren Hojsgaard Contact: sorenh at […]
  • R 文字列ベクトルで文字列を指定して要素を削除する方法R 文字列ベクトルで文字列を指定して要素を削除する方法 Rの文字列ベクトルで、文字列を指定して要素を削除する方法をお伝えする。 通常、ベクトルの要素を削除する場合は、次のように添字にマイナスを付加して削除する。 > s # 1番目の要素を削除 > s[-1] [1] "猫である。" "名前は" "まだ無い。" > # 1番目から2番目の要素を削除 > s[-1:-2] [1] "名前は" […]
  • R実装と解説 母平均の検定(母分散未知) [latexpage] 母分散が未知の場合の母平均の検定とは、母集団が正規分布に従い、母分散が未知のときに母平均が標本平均と「異なる」または「大きい」、「小さい」かどうかを、検定統計量がt分布に従うことを利用して検定します。 統計的検定の流れ 検定の大まかな流れを確認しておきます。 帰無仮説H0と対立仮設H1をたてます […]
  • Ubuntu,R OpenGLを用いた3次元可視化パッケージrglのインストール方法Ubuntu,R OpenGLを用いた3次元可視化パッケージrglのインストール方法 Ubuntu上のRで、OpenGLを用いた3次元可視化パッケージであるrglをインストールする方法をいくつかのパターンに分けてお伝します。 Rはaptコマンドによりインストールされているものとします。 R上でinstall.packages関数によりrlgパッケージをインストールしようとしても、次のように「X11が見つからない」とエラーが出てインストールできません。 […]
  • R言語 CRAN Task View:数値解析R言語 CRAN Task View:数値解析 CRAN Task View: Numerical Mathematicsの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: H.W. Borchers, R. Hankin, S. Sokol Contact: hwb at […]
R K-means法のクラスタ数を機械的に決定する方法

R K-means法のクラスタ数を機械的に決定する方法」への1件のフィードバック

コメントは受け付けていません。