//尾野 //↑追記します by Tajika 2004.09.05 COLOR(red){SIZE(30){RでSOM(自己組織化マップ)}} (工事中) #contents *Kohonenの自己組織化マップ(SOM : Self Organizing Map)について *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 パッケージ **class パッケージ [#wf203f73] --[[class(各種の分類用関数)パッケージ中のオブジェクト一覧]] **som パッケージ **som パッケージ [#t42b8dac] --[[som(旧名GeneSOM)(自己組織化マップ)パッケージ中のオブジェクト一覧]] **sammon map **sammon map [#ldeb25fc] **kohonen: 教師付き・教師なし自己組織化マップ **kohonen: 教師付き・教師なし自己組織化マップ [#x01d72b9] [[Kohonen(教師付き・教師なし自己組織化マップ)パッケージ中のオブジェクト一覧]] **klaR パッケージ **klaR パッケージ [#ad4484d8] -SOM 図?の描画 **wccsom: ピークシフトを利用したパターン比較のための SOM ネットワーク **wccsom: ピークシフトを利用したパターン比較のための SOM ネットワーク [#hfc4b9b2] *使い方(class パッケージ) **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(押し花?) *** sammon map(押し花?) [#s0a44787] *** hexagon *** hexagon [#h4a277a7] maptree パッケージ利用 *使い方 (som パッケージ) *使い方 (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 パッケージ) *使い方 (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