//尾野
//↑追記します 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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS