今週のテーマは クラスタリング その2です。前回は階層的クラスタリングでしたが,今回ご紹介するのは 非階層的クラスタリング と呼ばれる手法になります。
階層的クラスタリングが,まとめたクラスターのクタスター,クラスターのクラスターのクラスター,というように次々レベルを積み上げていったのに対し,非階層的クラスタリングはそういう積み上げをしない方式です。代表的な手法は* kmeans法 *と呼ばれています。
irisデータを使います。
data(iris)
head(iris[1:4])
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3.0 1.4 0.2
## 3 4.7 3.2 1.3 0.2
## 4 4.6 3.1 1.5 0.2
## 5 5.0 3.6 1.4 0.2
## 6 5.4 3.9 1.7 0.4
result.km <- kmeans(iris[1:4],3) #クラスタ数を3にする
result.km$cluster
## [1] 3 1 1 1 3 3 3 3 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 3 3 3 1
## [36] 3 3 3 1 3 3 1 1 3 3 1 3 1 3 3 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2
## [71] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2
## [106] 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 2 2 2 2 2 2 2 2 2 2
## [141] 2 2 2 2 2 2 2 2 2 2
iris$cluster <- result.km$cluster
xtabs(~Species+cluster,data=iris)
## cluster
## Species 1 2 3
## setosa 17 0 33
## versicolor 4 46 0
## virginica 0 50 0
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster+1) #形は種類,色はクラスタ
気付いた人もいるかもしれないが,kmeans法は階層的クラスタリングと違って先にクラスタ数を決めておかなければならない。 正解がわからないとどうなるだろうか。
result.km2 <- kmeans(iris[1:4],4) #クラスタ数を4にする
result.km2$cluster
## [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [36] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 2 1 2 1 2 1 2 2 2 2 1 2 1 2 2 1 2
## [71] 1 2 1 1 1 1 1 1 1 2 2 2 2 1 2 1 1 1 2 2 2 1 2 2 2 2 2 1 2 2 3 1 3 3 3
## [106] 3 2 3 3 3 1 1 3 1 1 3 3 3 3 1 3 1 3 1 3 3 1 1 3 3 3 3 3 1 1 3 3 3 1 3
## [141] 3 3 1 3 3 3 1 1 3 1
iris$cluster2 <- result.km2$cluster
xtabs(~Species+cluster2,data=iris)
## cluster2
## Species 1 2 3 4
## setosa 0 0 0 50
## versicolor 23 27 0 0
## virginica 17 1 32 0
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster2+1) #形は種類,色はクラスタ
このように,結果が意味するところがわかりにくくなることもある。
探索的な研究の場合は。クラスタ数が事前にわかっていることが少ない。 そのほか色々改良がなされている。
x-means,改良k-meansについてはこちらのサイトを参照 http://aaaazzzz036.hatenablog.com/archive/category/R
ここでは下二つを紹介する。 以下はRにパッケージを追加するので,インターネットに接続されている環境で実行すること。
ファジィなクラスタリング,というのはしっかり区別するんじゃなくて,クラスターに入る確率を求め,その確率が最も高いところを採用しますけど,というやり方。
library(e1071)
result.cm <- cmeans(iris[1:4],3)
head(result.cm$membership)
## 1 2 3
## [1,] 0.9966 0.001072 0.002304
## [2,] 0.9759 0.007498 0.016651
## [3,] 0.9798 0.006415 0.013761
## [4,] 0.9674 0.010108 0.022467
## [5,] 0.9945 0.001768 0.003762
## [6,] 0.9346 0.020621 0.044809
iris$cluster3 <- result.cm$cluster
xtabs(~Species+cluster3,data=iris)
## cluster3
## Species 1 2 3
## setosa 50 0 0
## versicolor 0 3 47
## virginica 0 37 13
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster3+1) #形は種類,色はクラスタ
データが発生する確率モデルがあるとして,それに基づいてデータが出現すると考えると,最も適切なクラスタ数は幾つか,というモデルに基づいたクラスタリングをするのがこちら。
library(mclust)
## Package 'mclust' version 4.4
## Type 'citation("mclust")' for citing this R package in publications.
result.MC <- Mclust(iris[1:4])
result.MC
## 'Mclust' model object:
## best model: ellipsoidal, equal shape (VEV) with 2 components
plot(result.MC,"BIC") #幾つかのモデルによる適合度
iris$cluster4 <- result.MC$classification
xtabs(~Species+cluster4,data=iris)
## cluster4
## Species 1 2
## setosa 50 0
## versicolor 0 50
## virginica 0 50
plot(iris[1:4],pch=as.numeric(iris$Species),col=iris$cluster4+1) #形は種類,色はクラスタ