R言語プログラミング: クラスター分析 - k-means

4/17(土)の第3回 データマイニング+WEB 勉強会@東京 (Tokyo.Webmining#3)での私の一つ目のトーク「1. R言語による クラスター分析 - 活用編 (60分)」の一部関連内容です。当日は、全体像も含め分かる形の講義資料で話します。
当日、USTREAM配信も行う予定ですので、興味のある方はぜひご覧下さい。
第3回 データマイニング+WEB 勉強会@東京 (Tokyo.Webmining#3) : ATND

※内容記述に関して粗い部分も、追って洗練します。

k-means

k-meansは、クラスター分析の非階層的手法で代表的な手法。
現実のクラスタリングでもk-meansが使われることが多く、実用的な手法。

※階層的手法の対極にある「非階層的手法」(分割最適化手法とも呼ばれる)。詳細は次エントリを参照:「はじめてでもわかる R言語によるクラスター分析」

アルゴリズム詳細は「第3回 データマイニング+WEB 勉強会@東京」でお話しします。また本エントリにも追記しようと思います。

R言語プログラミング

Rでは k-means によるクラスタリングを行う関数 kmeans()が標準で用意されている。

kmeans(x, centers, iter.max = 10, nstart = 1, 
       algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"))

[引数]

  • x : データセットを表す行列
  • centers :1)クラスタ数Kを指定する場合:初期値となる代表点はデータセットからランダムに取り出される。

2)クラスタの代表点ベクトルを指定する場合:クラスタ数 K はこの代表点の個数から算出される。
[任意引数(省略可能)]

  • iter.max : 繰り返しの最大回数。デフォルトは N=10。
  • nstart : ランダムに初期値を設定する場合のパラメータ。初期値を変更したい場合に用いる。
  • algorithm : 利用するアルゴリズムを Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"の中から選べる。デフォルトは "Hartigan-Wong"(通常、この"Hartigan-Wong"が最も良い結果を出すといわれている)。
ソース
x <- iris[,1:4] #解析データ:iris 1-4列のデータ
km <- kmeans(x,3) #k-meansの実行。クラスタ数は3に指定。

result <- km$cluster #クラスタリング結果の抽出
result #クラスタリング結果の表示

answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)

ctbl <- table(answer, result) #正解と結果のクロス表を作成
ctbl #クロス表の表示

calcEntropy(ctbl) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出 

関数 calcEntropy(ctbl) (エントロピー(Entropy)の算出)、calcPurity(ctbl) (純度 (Purity)の算出)の関数定義はhttp://d.hatena.ne.jp/hamadakoichi/20100324/p1:こちらにソースを載せてあります。

実行結果
> x <- iris[,1:4] #解析データ:iris 1-4列のデータ
> km <- kmeans(x,3) #k-meansの実行。クラスタ数は3に指定。
> 
> result <- km$cluster #クラスタリング結果の抽出
> result #クラスタリング結果の表示
  [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 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 [75] 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2
[112] 2 2 3 3 2 2 2 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2
[149] 2 3
> 
> answer <- iris[,5]     #クラスタリング正解:品種(iris 5列目)
> 
> ctbl <- table(answer, result) #正解と結果のクロス表を作成
> ctbl #クロス表の表示
            result
answer        1  2  3
  setosa     50  0  0
  versicolor  0  2 48
  virginica   0 36 14
> 
> calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.2308662
> calcPurity(ctbl)  #純度 (Purity)の算出 
[1] 0.8933333

結果はWard法の結果と同程度のよい結果を得られる。

※Entropyは小さく、Purityは大きい、ほうが良いクラスタリング。詳細は次エントリを参照: 「はじめてでもわかる R言語によるクラスター分析」

参考文献

Rで学ぶクラスタ解析

Rで学ぶクラスタ解析

クラスター分析入門―ファジィクラスタリングの理論と応用

クラスター分析入門―ファジィクラスタリングの理論と応用

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで