2006/12/30
■ [R tips] R でクラスタリング
最近シラバスに記述されているテキストをクラスタリングする機会がありました.似ている講義をクラスタリングすることで類似する講義のシラバスを閲覧することができます.
ここでは統計解析ソフト R でベクトルデータをクラスタリングする手法についてメモしておきます.クラスタリングについてはこちらに詳しく書かれているので参照してみてください.
クラスタリングに入る前にまずデータを準備します.今回はここに記述されている 16 種類の動物のベクトルデータを用いることにしました.
下記の形式でテキストデータを保存します.
Hato 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0.5 Kitsune 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0.5 Mendori 1 0 0 0 1 0 0 0 0 1 0.3 0 0 1 1 0.5 Raion 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0.5 Gachou 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 Washi 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 Inu 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 Ookami 0 1 0 0.5 0 1 1 0 0 0 0 1 0 0 0 0 Shimauma 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 Ahiru 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 Neko 1 0 0 0.5 0 1 1 0 0 0 0 1 0 0 0 0 Fukurou 1 0 1 0.5 0 1 1 0 0 0 1 1 1 0 0 0 Tora 0 0 1 0 0 1 1 0 1 0 0 1 1 0 0 0 Uma 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 1 Taka 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 1 Ushi 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1
コマンドラインから R を起動して,保存したテキストファイルを読み込みます.
> input <- read.table("a.dat", header=F, row.names=1)
そして各ベクトル間の距離を求めて,それをもとにクラスタリングを行ないます.
> input.d <- dist(input, method="euclid") > input.cl <- hclust(input.d, method="ward") > plot(input.cl, hang=-1) > # 結果を postscript に保存 > postscript(file="a.ps")
するとクラスタリング結果の図(デンドグラム)が表示されます.
最後にクラスタリング結果をテキストファイルに保存します.ここでは cutree でデータを 2 つのクラスタに分けます.
> # cutree の引数 k は何個のクラスタに分けるかを指定 > out <- cutree(input.cl, k=2) > write.table(out, file="out.dat")
out.dat には「ラベル クラスタ番号」の形式でデータが記述されます.
"Hato" 1 "Kitsune" 1 "Mendori" 1 "Raion" 1 "Gachou" 1 "Washi" 1 "Inu" 1 "Ookami" 2 "Shimauma" 2 "Ahiru" 2 "Neko" 2 "Fukurou" 2 "Tora" 2 "Uma" 2 "Taka" 2 "Ushi" 2
なぜかイヌとライオンが鳥類系のクラスタに分けられてますね...データを間違えたのかな.