RでSOM(自己組織化マップ)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
//尾野
//↑追記します by Tajika 2004.09.05
COLOR(red){SIZE(30){RでSOM(自己組織化マップ)}}
(工事中)
#contents
*Kohonenの自己組織化マップ(SOM : Self Organizing Map)について [#o0ca0b44]
自己組織化マップはニューラルネットの一種で、多次元データを圧縮して低次元のマップを描くものである。
非線形の主成分分析+クラスター分析とも言える。
詳細については Kohonen の著作である [[Self-Organizing Maps:http://www.springeronline.com/sgw/cda/frontpage/0,11855,4-40109-22-1509767-0,00.html]] を参照のこと。和訳もされており、[[自己組織化マップ:http://www.springer-tokyo.co.jp/content/ISBN4-431-70700-X.html]]として Springer から発売されている。
[[アマゾン:http://www.amazon.co.jp/exec/obidos/ASIN/443170700X/]]
でも売っているので詳細を知りたい方はこちらを参照のほど。
*パッケージ [#d7a33ac0]
Rでは以下のパッケージでコホネンの自己組織化マップをサポートしている。
**class パッケージ [#wf203f73]
--[[class(各種の分類用関数)パッケージ中のオブジェクト一覧]]
**som パッケージ [#t42b8dac]
--[[som(旧名GeneSOM)(自己組織化マップ)パッケージ中のオブジェクト一覧]]
**sammon map [#ldeb25fc]
**kohonen: 教師付き・教師なし自己組織化マップ [#x01d72b9]
[[Kohonen(教師付き・教師なし自己組織化マップ)パッケージ中のオブジェクト一覧]]
**klaR パッケージ [#ad4484d8]
-SOM 図?の描画
**wccsom: ピークシフトを利用したパターン比較のための SOM ネットワーク [#hfc4b9b2]
**soma: General-purpose optimisation with the Self-Organising Migrating Algorithm [#a26ca9e1]
*使い方(class パッケージ) [#ha90e5b1]
**パッケージのロード [#obd53446]
library(class)
** データ入力 [#q056c746]
コホネンの[[SOM_PAK:http://www.cis.hut.fi/research/som_lvq_pak.shtml]]のサンプル・データ ex.dat を使う
この ex.dat は、[[som_pak:http://www.cis.hut.fi/research/som_pak/]] パッケージに含まれている。
ex.dat の構成は以下ようになっている。
5
13.575570 12.656892 -1.424328 -2.302774 404.921600
13.844373 12.610620 -1.435429 -1.964423 404.978180
13.996934 12.669785 -1.384147 -1.830788 405.187378
14.060876 12.755087 -1.378407 -2.020230 404.892548
(以下中略)
24.066832 22.776152 -0.371480 1.382585 409.522491
23.332212 22.386673 -0.440821 0.525516 406.918518
最初の行にある 5 は column number を示し、Rでは利用しないので、
入力では scan("ex.dat",skip=1) とすることで最初の行をスキップする。
ex <- matrix(scan("ex.dat",skip=1),ncol=5,byrow=T) #
** 実行 [#bb51bc00]
*** マップの初期化 [#o70788d0]
12x8 のマップ、近傍関係は hexagonal(六角形) と rectanglar(四角形) の二つが選べるが
ここでは hexagonalを選択する。
gr<-somgrid(xdim=12,ydim=8,topo = "hexagonal") #randinit
*** マップのトレーニング [#n62b7d77]
上記で設定した マップ上に多次元データ exを投影する。
以下のパラメータはそれぞれ、rlen:学習回数, alpha:学習係数α = 0.02, radii:半径 = 10
test<-SOM(ex,gr,rlen=1000,alpha=0.02,radii=10) #vsom
** 結果出力 [#s44f6678]
*** レーダーチャート出力 + ラベル付け [#v2f10ce6]
SOMの教科書やアプリケーションでは正六角形を用いている。正六角形表示は難しくはないようだ。
plot(test)
なお、どの値がどこに割り当てられるのかを知りたくなるかもしれない。
この場合は以下を用いると良いだろう。
plot(test)
# 六角形配置にしたがって円を配置する (下記の 12*8は xdim, ydimに対応)
symbols(test$grid$pts[,1],test$grid$pts[,2],circles=rep(0.5,8*12),inches=F,add=T)
# knn1を使って ex 中のデータが SOMで割り当てた test$code (8*12ある)のどれに近いのかを調査
bins <- as.numeric(knn1(test$code,ex, 0:95));
# exから抜粋した値がどこに割り当てられるのかを示す。
# 全てをプロットすると収集がつかなくなるので seq(101, 1000, by=25)だけをプロットしてみる
text(test$grid$pts[bins[seq(101,1000,by=25)],] + rnorm(36,0,0.2),col="blue",as.character(seq(101,1000,by=25) ))
#ref(plotwith_classsom.jpg)
なお、図によれば751と701は同じ領域に(5値ともまんべんなく中庸)、
601と576も同じ領域(最後の変数(5時半の方向)だけが比較的高い)
にある。
以下の値で確認したところうまく分類できているようである。
> ex[701,]
[1] 24.788752 29.759186 -0.546825 0.164685 402.904144
> ex[751,]
[1] 24.40198 32.89207 -0.20661 -2.27529 404.54211
> ex[576,]
[1] -0.190742 5.562227 -15.627743 -15.601818 407.453247
> ex[601,]
[1] -2.853164 4.018708 -16.220818 -16.177996 405.366364
//*** ラベル付け
*** sammon map(押し花?) [#s0a44787]
*** hexagon [#h4a277a7]
maptree パッケージ利用
*使い方 (som パッケージ) [#u60d0297]
**パッケージのロード [#k8db7eec]
library(som);
**データ入力 [#j9041d53]
上記と同じex.datを使用する。ただし留意すべきは こちらのパッケージでは標準化しないと
描画の際に都合が悪い。
以下のようにして標準化しておく
ex.sc <- scale(ex);
なお、som packageにも normalize(標準化するためのもの?)とfiltering(サチらせるもの?)がついてくるので
こちらを使ってみるのも一つの手である。
**実行 [#m2384d01]
10x10のマップ、近傍関係はhexa(六角形)とrect(四角形)の二つが選べるが
今回は rectを選択する。
foo <- som(ex.sc, xdim=10,ydim=10,topol="rect");
**結果出力 [#zb2ee16b]
plot(foo);
値がどこに割り当てられるのかを知りたい場合は
# 対象の設定
obj <- seq(101, 1001,by=25);
n <- length(obj);
# 以下 rep(0.5, n*2) + rnorm(n*2, 0, 0.15)はラベルを微妙にずらすためのギミック
text(foo$visual[obj,c(1,2)] + rep(0.5, n*2)+ rnorm(n*2, 0, 0.15), as.character(obj), col="blue" )
#ref(plotwith_som.jpg)
*使い方 (kohonen パッケージ) [#ic33e385]
**パッケージのロード [#t52b0462]
library(kohonen)
**データ入力 [#w4a1bb66]
*関連リンク [#kbd2ebe3]
-[[R News Volume 3/3:http://cran.r-project.org/doc/Rnews/Rnews_2003-3.pdf]] の "Dimensional Reduction for Data Mapping"の章の4ページ "The self organising map"
-金明哲(2006):[[Rと自己組織化マップ:http://www1.doshisha.ac.jp/~mjin/R/30.pdf]],フリーソフトによるデータ解析・マイニング、ESTRELA
----
-実例などを入れさせて頂きました。誤りなどありましたらご指摘願います。 -- [[Tajika]] &new{2004-09-06 (月) 01:39:16};
-実例は大変ありがたいのですが、文章をもう少し工夫されたら、いかがでしょうか? -- &new{2004-09-06 (月) 16:49:18};
-文章を工夫したほうがよいかどうかはわかりませんが、このページ役にたちましたよ.ありがとうございます. -- [[なつ]] &new{2007-01-17 (水) 14:52:47};
#comment
終了行:
//尾野
//↑追記します by Tajika 2004.09.05
COLOR(red){SIZE(30){RでSOM(自己組織化マップ)}}
(工事中)
#contents
*Kohonenの自己組織化マップ(SOM : Self Organizing Map)について [#o0ca0b44]
自己組織化マップはニューラルネットの一種で、多次元データを圧縮して低次元のマップを描くものである。
非線形の主成分分析+クラスター分析とも言える。
詳細については Kohonen の著作である [[Self-Organizing Maps:http://www.springeronline.com/sgw/cda/frontpage/0,11855,4-40109-22-1509767-0,00.html]] を参照のこと。和訳もされており、[[自己組織化マップ:http://www.springer-tokyo.co.jp/content/ISBN4-431-70700-X.html]]として Springer から発売されている。
[[アマゾン:http://www.amazon.co.jp/exec/obidos/ASIN/443170700X/]]
でも売っているので詳細を知りたい方はこちらを参照のほど。
*パッケージ [#d7a33ac0]
Rでは以下のパッケージでコホネンの自己組織化マップをサポートしている。
**class パッケージ [#wf203f73]
--[[class(各種の分類用関数)パッケージ中のオブジェクト一覧]]
**som パッケージ [#t42b8dac]
--[[som(旧名GeneSOM)(自己組織化マップ)パッケージ中のオブジェクト一覧]]
**sammon map [#ldeb25fc]
**kohonen: 教師付き・教師なし自己組織化マップ [#x01d72b9]
[[Kohonen(教師付き・教師なし自己組織化マップ)パッケージ中のオブジェクト一覧]]
**klaR パッケージ [#ad4484d8]
-SOM 図?の描画
**wccsom: ピークシフトを利用したパターン比較のための SOM ネットワーク [#hfc4b9b2]
**soma: General-purpose optimisation with the Self-Organising Migrating Algorithm [#a26ca9e1]
*使い方(class パッケージ) [#ha90e5b1]
**パッケージのロード [#obd53446]
library(class)
** データ入力 [#q056c746]
コホネンの[[SOM_PAK:http://www.cis.hut.fi/research/som_lvq_pak.shtml]]のサンプル・データ ex.dat を使う
この ex.dat は、[[som_pak:http://www.cis.hut.fi/research/som_pak/]] パッケージに含まれている。
ex.dat の構成は以下ようになっている。
5
13.575570 12.656892 -1.424328 -2.302774 404.921600
13.844373 12.610620 -1.435429 -1.964423 404.978180
13.996934 12.669785 -1.384147 -1.830788 405.187378
14.060876 12.755087 -1.378407 -2.020230 404.892548
(以下中略)
24.066832 22.776152 -0.371480 1.382585 409.522491
23.332212 22.386673 -0.440821 0.525516 406.918518
最初の行にある 5 は column number を示し、Rでは利用しないので、
入力では scan("ex.dat",skip=1) とすることで最初の行をスキップする。
ex <- matrix(scan("ex.dat",skip=1),ncol=5,byrow=T) #
** 実行 [#bb51bc00]
*** マップの初期化 [#o70788d0]
12x8 のマップ、近傍関係は hexagonal(六角形) と rectanglar(四角形) の二つが選べるが
ここでは hexagonalを選択する。
gr<-somgrid(xdim=12,ydim=8,topo = "hexagonal") #randinit
*** マップのトレーニング [#n62b7d77]
上記で設定した マップ上に多次元データ exを投影する。
以下のパラメータはそれぞれ、rlen:学習回数, alpha:学習係数α = 0.02, radii:半径 = 10
test<-SOM(ex,gr,rlen=1000,alpha=0.02,radii=10) #vsom
** 結果出力 [#s44f6678]
*** レーダーチャート出力 + ラベル付け [#v2f10ce6]
SOMの教科書やアプリケーションでは正六角形を用いている。正六角形表示は難しくはないようだ。
plot(test)
なお、どの値がどこに割り当てられるのかを知りたくなるかもしれない。
この場合は以下を用いると良いだろう。
plot(test)
# 六角形配置にしたがって円を配置する (下記の 12*8は xdim, ydimに対応)
symbols(test$grid$pts[,1],test$grid$pts[,2],circles=rep(0.5,8*12),inches=F,add=T)
# knn1を使って ex 中のデータが SOMで割り当てた test$code (8*12ある)のどれに近いのかを調査
bins <- as.numeric(knn1(test$code,ex, 0:95));
# exから抜粋した値がどこに割り当てられるのかを示す。
# 全てをプロットすると収集がつかなくなるので seq(101, 1000, by=25)だけをプロットしてみる
text(test$grid$pts[bins[seq(101,1000,by=25)],] + rnorm(36,0,0.2),col="blue",as.character(seq(101,1000,by=25) ))
#ref(plotwith_classsom.jpg)
なお、図によれば751と701は同じ領域に(5値ともまんべんなく中庸)、
601と576も同じ領域(最後の変数(5時半の方向)だけが比較的高い)
にある。
以下の値で確認したところうまく分類できているようである。
> ex[701,]
[1] 24.788752 29.759186 -0.546825 0.164685 402.904144
> ex[751,]
[1] 24.40198 32.89207 -0.20661 -2.27529 404.54211
> ex[576,]
[1] -0.190742 5.562227 -15.627743 -15.601818 407.453247
> ex[601,]
[1] -2.853164 4.018708 -16.220818 -16.177996 405.366364
//*** ラベル付け
*** sammon map(押し花?) [#s0a44787]
*** hexagon [#h4a277a7]
maptree パッケージ利用
*使い方 (som パッケージ) [#u60d0297]
**パッケージのロード [#k8db7eec]
library(som);
**データ入力 [#j9041d53]
上記と同じex.datを使用する。ただし留意すべきは こちらのパッケージでは標準化しないと
描画の際に都合が悪い。
以下のようにして標準化しておく
ex.sc <- scale(ex);
なお、som packageにも normalize(標準化するためのもの?)とfiltering(サチらせるもの?)がついてくるので
こちらを使ってみるのも一つの手である。
**実行 [#m2384d01]
10x10のマップ、近傍関係はhexa(六角形)とrect(四角形)の二つが選べるが
今回は rectを選択する。
foo <- som(ex.sc, xdim=10,ydim=10,topol="rect");
**結果出力 [#zb2ee16b]
plot(foo);
値がどこに割り当てられるのかを知りたい場合は
# 対象の設定
obj <- seq(101, 1001,by=25);
n <- length(obj);
# 以下 rep(0.5, n*2) + rnorm(n*2, 0, 0.15)はラベルを微妙にずらすためのギミック
text(foo$visual[obj,c(1,2)] + rep(0.5, n*2)+ rnorm(n*2, 0, 0.15), as.character(obj), col="blue" )
#ref(plotwith_som.jpg)
*使い方 (kohonen パッケージ) [#ic33e385]
**パッケージのロード [#t52b0462]
library(kohonen)
**データ入力 [#w4a1bb66]
*関連リンク [#kbd2ebe3]
-[[R News Volume 3/3:http://cran.r-project.org/doc/Rnews/Rnews_2003-3.pdf]] の "Dimensional Reduction for Data Mapping"の章の4ページ "The self organising map"
-金明哲(2006):[[Rと自己組織化マップ:http://www1.doshisha.ac.jp/~mjin/R/30.pdf]],フリーソフトによるデータ解析・マイニング、ESTRELA
----
-実例などを入れさせて頂きました。誤りなどありましたらご指摘願います。 -- [[Tajika]] &new{2004-09-06 (月) 01:39:16};
-実例は大変ありがたいのですが、文章をもう少し工夫されたら、いかがでしょうか? -- &new{2004-09-06 (月) 16:49:18};
-文章を工夫したほうがよいかどうかはわかりませんが、このページ役にたちましたよ.ありがとうございます. -- [[なつ]] &new{2007-01-17 (水) 14:52:47};
#comment
ページ名: