Rでスペクトラル・クラスタリングを使う

| Topic path: Top / バイオ・データ・マイニング / Rでスペクトラル・クラスタリングを使う

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

#html{{
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4320057082&ref=tf_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=tf_til&t=tohgorohmatsu-22&m=amazon&o=9&p=8&l=as1&IS2=1&detail=1&asins=4320057082&linkId=f6db5311dcfd9a82f5dee20859d39574&bc1=ffffff&lt1=_blank&fc1=444b4c&lc1=444b4c&bg1=ffffff&f=ifr"></iframe>
}}


*準備 [#e03b8e43]

Rのインストールについては,次のページを見てください.
-[[MacでRを使う>機械学習/MacでRを使う]]
-[[WindowsでRを使う>機械学習/WindowsでRを使う]]


[math]k[/math]平均法が苦手なデータとして,二重円のデータを作成します.
[math]-4[/math]から[math]4[/math]までの二次元の一様乱数を1,000個生成し,半径[math]3[/math]から[math]4[/math]の範囲にあるデータを[math]c_2[/math],半径[math]1[/math]から[math]2[/math]の範囲にあるデータを[math]c_1[/math]とします.
#geshi((rsplus){{
> 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)
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)
}}
#ref(logo.png,nolink,50%)

まずは[math]k[/math]平均法を試して見ます.
#geshi(rsplus){{
> km = kmeans(logo, 2)
> plot(logo, col=km$cluster, pch=km$cluster)
km = kmeans(logo, 2)
plot(logo, col=km$cluster, pch=km$cluster)
}}
#ref(logo_kmeans.png,nolink,50%)

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


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



*スペクトラル・クラスタリング [#n0aec749]

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

スペクトラル・クラスタリングを行うには,''specc''コマンドを用います.
speccコマンドには,データとクラスター数を引数として与えます.
#geshi(rsplus){{
> sc = specc(logo, center=2)
> plot(logo, col=sc, pch=sc)
sc = specc(logo, center=2)
plot(logo, col=sc, pch=sc)
}}
#ref(logo_specc.png,nolink,50%)

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


サンプル・データの''spirals''でも試してみます.
#geshi(rsplus){{
> data(spirals)
> plot(spirals)
data(spirals)
plot(spirals)
}}
#ref(spirals.png,nolink,50%)

まず,[math]k[/math]平均法を試します.
#geshi(rsplus){{
> km = kmeans(spirals, 2)
> plot(spirals, col=km$cluster, pch=km$cluster)
km = kmeans(spirals, 2)
plot(spirals, col=km$cluster, pch=km$cluster)
}}
#ref(spirals_kmeans.png,nolink,50%)

次に,スペクトラル・クラスタリングを用います.
#geshi(rsplus){{
> sc = specc(spirals, center=2)
> plot(spirals, col=sc, pch=sc)
sc = specc(spirals, center=2)
plot(spirals, col=sc, pch=sc)
}}
#ref(spirals_specc.png,nolink,50%)

''specc''は内部でランダムな初期化を行っていますので,[math]k[/math]平均法と同様に,乱数のシードによって結果が変わります.
同じ結果を得るためには,''seed.set''を用いて乱数のシードを指定してからスペクトラル・クラスタリングを行います.
#geshi(rsplus){{
> set.seed(0)
> sc = specc(spirals, center=2)
set.seed(0)
sc = specc(spirals, center=2)
}}


*irisデータセット [#mc2c8f40]

''irisデータセット''でもやってみましょう.

#geshi(rsplus){{
> data(iris)
data(iris)
}}

このデータセットは,アヤメの種類(Species)をがく片の長さ(Sepal.Length),幅(Lepal.Width),花びらの長さ(Petal.Length),幅(Petal.Width)によって分類する問題です.
長さと幅は連続値,種類はsetosa, versicolor, virginicaのいずれかをとる離散値です.

このデータセットには,setosa, versicolor, virginicaという3種類のアヤメについて,それぞれ50個ずつ,合計150個のデータが含まれています.
ランダムに10個のデータを選択して,見てみましょう.
#geshi(rsplus){{
> iris[sort(sample(1:150,10)),]
iris[sort(sample(1:150,10)),]
}}
#geshi(rsplus){{
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
4            4.6         3.1          1.5         0.2     setosa
22           5.1         3.7          1.5         0.4     setosa
65           5.6         2.9          3.6         1.3 versicolor
97           5.7         2.9          4.2         1.3 versicolor
100          5.7         2.8          4.1         1.3 versicolor
108          7.3         2.9          6.3         1.8  virginica
116          6.4         3.2          5.3         2.3  virginica
122          5.6         2.8          4.9         2.0  virginica
136          7.7         3.0          6.1         2.3  virginica
146          6.7         3.0          5.2         2.3  virginica
}}

ここでは,Speciesを除いた1列目から4列目だけを取り出して使います.
#geshi(rsplus){{
> iris.nolabel <- iris[1:4]
iris.nolabel <- iris[1:4]
}}

4次元データですが,このうちのSepal.LengthとPetal.Lengthだけを取り出して表示します.
データを表示するときの色''col''と形''pch''にはirisのSpeciesを''as.numeric関数''で数値化したものを指定します.
#geshi(rsplus){{
> plot(iris.nolabel$Sepal.Length, iris.nolabel$Petal.Length,
+ col=as.numeric(iris$Species), pch=as.numeric(iris$Species))
plot(iris.nolabel$Sepal.Length, iris.nolabel$Petal.Length,
    col=as.numeric(iris$Species), pch=as.numeric(iris$Species))
}}
#ref(iris.png,nolink,40%)

カテゴリーの数は3だとわかっていますので,クラスター数を[math]3[/math]としてスペクトラル・クラスタリングを行います.
#geshi(rsplus){{
> iris.nolabel.specc <- specc(iris.nolabel, center=3)
iris.nolabel.specc <- specc(iris.nolabel, center=3)
}}

今度は色と形をクラスタリングによって得られたクラスター番号によって指定して表示します.
#geshi(rsplus){{
> plot(iris.nolabel$Sepal.Length, iris.nolabel$Petal.Length,
+ col=iris.nolabel.specc, pch=iris.nolabel.specc)
plot(iris.nolabel$Sepal.Length, iris.nolabel$Petal.Length,
    col=iris.nolabel.specc, pch=iris.nolabel.specc)
}}
#ref(iris_specc.png,nolink,40%)

残念ながら,irisデータセットはスペクトラル・クラスタリングではうまくクラスタリングできませんでした.


*まとめ [#a640c60a]

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

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

(内部で行われているクラスタリングが乱数に依存する手法の場合)スペクトラル・クラスタリングの結果は乱数のシードに依存しますので,乱数のシードを変えて実行するとよりよい結果が得られる可能性があります.

*参考文献 [#y0547ce9]

#html{{
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4320057082&ref=tf_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=tohgoroh-22&o=9&p=8&l=as1&asins=4274067033&ref=qf_sp_asin_til&fc1=444B4C&IS2=1&lt1=_blank&m=amazon&lc1=444B4C&bc1=FFFFFF&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=tf_til&t=tohgorohmatsu-22&m=amazon&o=9&p=8&l=as1&IS2=1&detail=1&asins=4320057082&linkId=f6db5311dcfd9a82f5dee20859d39574&bc1=ffffff&lt1=_blank&fc1=444b4c&lc1=444b4c&bg1=ffffff&f=ifr"></iframe>
}}

-[[クラスタリングとは(クラスター分析とは):http://www.kamishima.net/jp/clustering/]] - 神嶌敏弘さん
-[[スペクトラルクラスタリングは次元圧縮しながらKmeansする手法:http://d.hatena.ne.jp/mamoruk/20090128/p1]] - 観月橋日記 (続生駒日記)
-[[Rでk平均法を使う>バイオ・データ・マイニング/Rでk平均法を使う]] - とうごろうぃき
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS