K-meansクラスタリング


クラスター分析とは対象となる個体を似ているもの同士でまとめていき、最終的には任意の数のクラスターに分類する手法の総称です。

クラスタリングには階層型と非階層型が存在します。
階層型は、分類対象を段階的に徐々に分類していきます。
一方、非階層型は、あらかじめ分析者がクラスター数を決めておき、その数を目標にグルーピングを行います。
非階層型クラスター分析の代表的なものはK-means法です。
この方法では、
①各点にランダムにクラスタを割り当てる 
②クラスタの重心を計算する
③各々の点が属するクラスタを、一番近い重心のクラスタに変更する
④変化がなければ終了。変化がある限りは ②. に戻る。

Wikipediaには同様のことが以下の表現で書かれています。
  1. 各データxi(i = 1 ・・・n)に対してランダムにクラスタを割り振る。
  2. 割り振ったデータをもとに各クラスタの中心Vj(j=1・・・K)を計算する。計算は通常割り当てられたデータの各要素の平均が使用される。
  3. 各 xi と各 Vj との距離を求め、xi を最も近い中心のクラスタに割り当て直す。
  4. 上記の処理で全ての xi のクラスタの割り当てが変化しなかった場合は処理を終了する。それ以外の場合は新しく割り振られたクラスタから Vj を再計算して上記の処理を繰り返す。
以下ではRのirisデータの花弁との長さと幅だけに関して着目して二次元でのクラスタリングを行う。

#######以下、解析スクリプト##########
data(iris)

class(iris)
[1] "data.frame"

#花弁(Petal)の長さと幅だけを取り出す
head(iris[,3:4])
  Petal.Length Petal.Width
1          1.4         0.2
2          1.4         0.2
3          1.3         0.2
4          1.5         0.2
5          1.4         0.2
6          1.7         0.4


# k-means法を用いたクラスター分析を行う
# kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"))
# データオブジェクト
# centers : クラスターの数
# nstart : ランダムに初期値を設定する場合のパラメータ。初期値を変更したい場合に用いる。
# iter.max : 繰り返し(iteration)の最大回数

KM <- kmeans(iris[, 3:4], 3, nstart=100, algorithm = "MacQueen")$cluster

#結果の表示
KM
  [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 3 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 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 3 2 2 2 2
[112] 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2
[149] 2 2

#結果の描写。KMオブジェクトの内容を色により反映させる。
png("k-means.png")
 plot(iris[,3:4],pch=c(15,16,17)[iris[,5]], col=KM, main="K-means Clustering (iris data) ")
dev.off()




【参考文献】
Wikipedia - k平均法

極めて個人的なメモ

クラスタリングの定番アルゴリズム「K-means法」をビジュアライズしてみた

hamadakoichi blog