tokyo r 11_self_organizing_map
TRANSCRIPT
Tokyo.R #11 (2011/01/29)『Rによるデータサイエンス』第 II 部第 6 章
「自己組織化マップ」SOM:Self-Organizing Map発表者: Bob#3(TwitterID:@bob3bob3)
初心者の方へ
● 今日のお話はあまり初心者向けではありません…
– @sakaue さんの Japan.R での講義資料が素晴らしいのでお勧めです。
● http://lab.sakaue.info/wiki.cgi/JapanR2010?page=JapanR2010AM
自己組織化マップとは?● Teuvo Kohonen が 1980 年代前半に提案した
手法。
● ニューラルネットワークモデルの一種で、人間が脳の中で情報を分類・整理する過程を模した方法。
● 多次元データをより低次元(多くの場合は2次元)のマップに落とし込み可視化する、というのが良く使われるケース。その意味で主成分分析や MDS に似ている。
● 格子状または蜂の巣状のグリッドを用意し、それぞれの部屋(ユニット)に似たものを集めてゆく。
● クラスタリングの一種としても使われる。
要は「脳内メーカー」
http://maker.usoko.net/nounai/
事例紹介
RでSOM
● 主なパッケージと関数
– {som} som()
– {class} SOM(), batchSOM()
– {kohonen} som()
– {wccsom} wccsom()
RでSOM
● 主なパッケージと関数
– {som} som()
– {class} SOM(), batchSOM()
– {kohonen} som() ← 今回紹介するのはコレ!
– {wccsom} wccsom()
毎度おなじみ「あやめ」のデータ● いわゆる「フィッシャーのあやめのデータ」
● 3品種の菖蒲のがく片の長さと幅、花びらの長さと幅のデー
タ (n=150) 。
● 詳しくはウィキペディア(英語版)で!– http://en.wikipedia.org/wiki/Iris_flower_data_set
setosa versicolor virginica
{kohonen} som()library(kohonen) #パッケージの読み込みset.seed(10) # 乱数種の指定
# som()はマトリクスしか受け付けないので変換iris.mat <- as.matrix(iris[,1:4])
#グリッドの大きさを指定。ただし「x*y < サンプルサイズ」# topoはグリッドの形状の指定。格子状の場合は“rect”# 蜂の巣状の場合は“hexa”GRID <- somgrid(xdim=3, ydim=3, topo="hexa")
# 自己組織化マップの実行iris.som <- som(iris.mat, # 分析するデータ。マトリクス grid=GRID, # グリッドの指定 rlen=1000) # 反復回数
# 各個体がどのユニットに分類されたかは$unit.classifに入っているtable(iris.som$unit.classif)# 1 2 4 5 6 7 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 18 7 5 6 19 6 4 3 4 8 3 8 4 11 2 6 8 2 9 7 5 5
Sepal.LengthSepal.Width
Petal.LengthPetal.Width
とりあえず、 plot() !plot(iris.som, bg="#FFFF99")
バリエーション
plot(iris.som, bg="#FFFF99", codeRendering="stars")
plot(iris.som, bg="#FFFF99", codeRendering="lines")
マップ!Mapping plot
se
sese
se
sese
se
se
sese
se
sesese
se se se
se
sesese
se
se
se
sese
sesese
sese
sesese
se
se
se se
se
sese
se
se
sese
se
se
se
se
se
ve
ve
veve
veve
ve
ve
ve
ve
ve
ve
veve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
veve ve
veve
veve
ve
ve
veveve
ve
ve
ve
vi
vi
vi
vivi
vi
vi
vivi vivi
vi
vi
vivi
vi
vi
vivi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vivi
vi
vi
vivivi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
ユニットごとの個体数
収束の様子
0 200 400 600 800 1000
0.020
0.025
0.030
Training progress
Iteration
Mean distance to closest unit
さらにユニットをクラスタリングMapping plot
se
se sese
se
se
se
se
sese
se
se
se
se
se
sesese sese se
se
se
se
se
se
sese
se
se
se
sese
se
se
se
sese
se
sese
sese
se
se
se
se
se
se
se
veveveve
veve
ve
ve
ve
ve
ve
ve
veve
ve
veve
ve
veve
ve
ve
ve
veveve
ve
veve
veve
veve
ve
ve
ve
veve
ve
veveve
ve
ve
veve
ve
ve
ve
ve
vi
vi
vi
vi
vivi
vi
vivi
vi
vi
vi
vi
vivi
vi vi vi vi
vi
vi
vi
vi
vi
vivi
vivi
vi
vi
vi
vivi
vivi
vi
vivi
vi
vivivi
vi
vivivi
vi
vi
vi
vi
書き方# 色と記号の設定COL <- c("#FF3300", "#339966", "#0041FF")BGC <- c("#FFFF99", "#76E4A6", "#B4EBFA")SP <- as.numeric(iris[,5])LBL <- c("se","ve","vi")
# マップplot(iris.som, type="mapping", labels=LBL[SP], col=COL[SP], bg=BGC[1])
# ユニットごとの個体数plot(iris.som, type="counts")
# 収束の様子plot(iris.som, type="changes")
# ユニットをクラスタリングして色づけBGC <- c("#FFFF99", "#76E4A6", "#B4EBFA")iris.som.dist <- dist(iris.som$codes)^2CLST <-cutree(hclust(iris.som.dist,"ward"),3)plot(iris.som, type="mapping", labels=LBL[SP], col=COL[SP], bgcol=BGC[CLST])
グリッドを細かくするとMapping plot
se sese
sesese
se
se
se
se
se
se
se
se
se
se
se
se
se
se
se
se
se
se se
se
se
se
se
sese
se
se
se
se
se
se
se
se
se
se sese
se
se
sese se
se
se
ve
ve
ve
ve
ve ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
veve
ve
ve ve
ve
veve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
ve
veve
ve
ve
ve
vivi
vi
vi
vi
vi
vi
vi
vivi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vivi
vi
vi
vi
vi
vi
vi
vi
vi
vi
vivi
vi
vi
vi vivi
vi
vi
vi
vi
vivi vi
vi vi
vi
vi
vi
主成分分析やMDSでは
書き方
# グリッドを細かくするとGRID <- somgrid(xdim=12, ydim=12, topo="hexa") iris.som <- som(iris.mat, grid=GRID, rlen=1000)iris.som.dist <- dist(iris.som$codes)^2CLST <-cutree(hclust(iris.som.dist,"ward"),3)plot(iris.som, type="mapping", labels=LBL[SP], col=COL[SP], bgcol=BGC[CLST])
# 主成分分析の場合iris.pca <- princomp(iris[,-5])plot(iris.pca$scores[,1:2], pch=21, bg=COL[SP], main="主成分分析")
# 非計量MDS(マンハッタン距離)の場合library(MASS)iris.mds <- isoMDS(dist(iris[-143,-5], "man"))plot(iris.mds$points, pch=21, bg=COL[SP], main="非計量MDS")
ご清聴、ありがとうございました。