はじめに

『Rによるバイオインフォマティクスデータ解析』の7.9.1節「k-menas」を参考にして,k平均法を行います.

準備

Rのインストールについては,次のページを見てください.

まず,[math](1, 1)[/math] を中心として,[math]x[/math]座標と[math]y[/math]座標をそれぞれ分散0.3として正規分布で100個の点を生成し,これをc1とします. 次に,[math](-1 -1)[/math] を中心として,同じように分散0.3の正規分布で100個の点を生成し,これをc2とします. c1とc2をまとめて,dataとし,これをプロットします.

set.seed(123)
x1 = rnorm(100, mean=1, sd=0.3)
y1 = rnorm(100, mean=1, sd=0.3)
c1 <- cbind(x1, y1)
x2 = rnorm(100, mean=-1, sd=0.3)
y2 = rnorm(100, mean=-1, sd=0.3)
c2 <- cbind(x2, y2)
data1 <- rbind(c1, c2)
colnames(data1) <- c("x", "y")
plot(data1)
kmeans_data1.png

クラスタリング

クラスタリングは,分類対象のデータ集合をいくつかのグループに分割するものです. 分割された部分データ集合をクラスターといいます.

クラスタリングの手法には,主に階層的アプローチ分割最適化アプローチがあります. ここでは,後者の分割最適化アプローチの一つである[math]k[/math]平均法を行います.

k平均法

[math]k[/math]平均法([math]k[/math]-means)は,データの集合を [math]k[/math] 個のクラスターに分割します. クラスター数 [math]k[/math] を最初に決めておかなければなりません.

[math]k[/math]平均法は,次の手順で行います.

  1. 各データ [math]\bf{x}_1, \dots, \bf{x}_n[/math] に対して,ランダムにクラスター [math]c_1, \dots, c_k[/math] を割り当てる.
  2. クラスター [math]c_1, \dots, c_k[/math] ごとに,クラスター [math]c_i[/math] に割り当てられたデータの平均を求め,それを [math]c_i[/math] の中心とする.
  3. 各データ [math]\bf{x}_1, \dots, \bf{x}_n[/math] に対して,データ [math]\bf{x}_i[/math] と各クラスター [math]c_1, \dots, c_k[/math] の中心との距離を求め,[math]\bf{x}_i[/math] を最も中心が近いクラスターに割り当て直す.
  4. 全てのデータについてクラスターの割り当てが変更されなかったら終了する.そうでない場合は,ステップ2へ戻る.

Rで[math]k[/math]平均法を用いるには,kmeans関数を用います. kmeans関数の引数には,分割するデータとクラスター数 [math]k[/math] を与えます.

data1.kmeans <- kmeans(data1, 2)

作成されたオブジェクトのcluster変数には割り当てられたクラスター番号が,center変数には各クラスターの中心座標が格納されます.

data1.kmeans$cluster

結果をプロットすると次のようになります.

  [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [26] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [51] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [76] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[101] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[126] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[151] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[176] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
kmeans1.png

[math]k[/math]平均法の結果は,最初に行われるランダムな割り当てに依存します. nstartオプションの値(デフォルトは1)を2以上にすると,nstart回実行して最もよい結果を返します.

data1.kmeans$center

また,[math]k[/math]平均法を実行するたびに結果が変わるので,同じ結果を得るには,set.seedを用いて乱数のシードをセットしてから実行します.

           x         y
1 -0.9638605 -1.010867
2  1.0271218  0.967736

k平均法が苦手な問題

今度は,もう少し分散を大きくし,かつ,データの個数を同じにしないでやってみます.

plot(data1, col=data1.kmeans$cluster, pch=data1.kmeans$cluster)
points(data1.kmeans$centers, col=1:2, pch=8, cex=2)
kmeans_data2.png
> data1.kmeans <- kmeans(data1, 2, nstart=10)
kmeans2.png

すると,データを生成するときに使用した中心 [math](1, 1), (-1, -1)[/math] よりもずれてしまいました. [math]k[/math]平均法はこういう問題はうまくクラスタリングできません.

まとめ

[math]k[/math]平均法は,[math]k[/math] 個のクラスターへの割り当てとクラスターの中心の計算を繰り返す,分割最適化アプローチのクラスタリング手法です.

[math]k[/math]平均法では,クラスターの数 [math]k[/math] をユーザーが事前に与えなければなりません. したがって,いくつかの [math]k[/math] を試して最もうまくいったものを採用するという方法をとることがあります.

[math]k[/math]平均法の結果は,最初に行われるランダムな割り当てに依存します. nstartオプションで複数回実行して最も良い結果を採用するか,乱数のシードを変えて実行すると,よりよい結果が得られる可能性があります.

また,[math]k[/math]平均法ではうまくいかない問題があることがよく知られています. そのようなときは,スペクトラル・クラスタリングを用いるとうまくいくかもしれません.

参考文献

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS