Loading jsMath...

はじめに

『Rによるバイオインフォマティクスデータ解析』の7.10節「スペクトラル・クラスタリング」を参考にして,スペクトラル・クラスタリングを行います.

準備

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

k平均法が苦手なデータとして,二重円のデータを作成します. -4から4までの二次元の一様乱数を1,000個生成し,半径3から4の範囲にあるデータをc_2,半径1から2の範囲にあるデータをc_1とします.

x = runif(1000) * 8 - 4
y = runif(1000) * 8 - 4
data = cbind(x, y)
c2 = (x^2 + y^2) < 16 & (x^2 + y^2) > 9
c1 = (x^2 + y^2) <  4 & (x^2 + y^2) > 1
logo = data[(c2 | c1),]
plot(logo)
logo.png

まずはk平均法を試して見ます.

km = kmeans(logo, 2)
plot(logo, col=km$cluster, pch=km$cluster)
logo_kmeans.png

やはりk平均法ではうまくクラスタリングできません.

スペクトラル・クラスタリングは,kernlabパッケージで提供されています. そこで,kernlabパッケージをインストールします.install.packagesコマンドを実行すると,パッケージをダウンロードするサーバーを聞かれますので,リストからJapanのどれかを選択します.

install.packages("kernlab")
library(kernlab)

スペクトラル・クラスタリング

スペクトラル・クラスタリングは,距離行列(類似度行列)を次元削減してそこでk平均法などのクラスタリングを行う手法です.

スペクトラル・クラスタリングを行うには,speccコマンドを用います. speccコマンドには,データとクラスター数を引数として与えます.

sc = specc(logo, center=2)
plot(logo, col=sc, pch=sc)
logo_specc.png

スペクトラル・クラスタリングではきれいにクラスタリングできました.

サンプル・データのspiralsでも試してみます.

data(spirals)
plot(spirals)
spirals.png

まず,k平均法を試します.

km = kmeans(spirals, 2)
plot(spirals, col=km$cluster, pch=km$cluster)
spirals_kmeans.png

次に,スペクトラル・クラスタリングを用います.

sc = specc(spirals, center=2)
plot(spirals, col=sc, pch=sc)
spirals_specc.png

まとめ

スペクトラル・クラスタリングは,距離行列(類似度行列)を次元削減してそこでk平均法などのクラスタリングを行う手法です.

k平均法が苦手とするようなデータでもうまくいくことがあります.

参考文献

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