自己組織化マップ Self-Organization Map (SOM)
自己組織化マップとは? K 平均アルゴリズムは あらかじめクラスター数 K を設定し 互いに近い値を持った各要素が同一クラスターに所属するように所属クラスターを決めてゆく 自己組織化マップは互いに近い値を持った各要素が近くなるように低い次元上にマップする 自己組織化マップは 1988 年に Kohonen が提案した (Kohonen 1934-)
自己組織化とは? (Wikipedia より ) 大脳皮質の視覚野をモデル化したニューラルネットの一種 教師なし学習によるクラスタリングの手法の一つ 次元削減による可視化の手法の一つ
生物の神経細胞の構造をモデル化 樹状突起 軸索 細胞体 神経末端 ( 基礎分子生物学 3 学生作成資料より ) 神経細胞 すなわちニューロンが情報処理の単位 樹状突起がニューロンに対する入力 軸索がニューロンからの出力 計算機上では各ニューロンをノード 軸索をエッジとして表す
似た情報が入力されると 脳の似た細胞が反応する?
SOM (Self Organization Map) 自己組織化マップ 多次元情報を低い次元にマッピングする データが近いもの同士がマッピングでも近くなるように配置する X(1) = (9.5, 3.2, 7.5, 9.7, 6.1) X(2) = (2.1, 2.9, 2.1, 3.1, 1.1) X(3) = (2.2, 2.7, 2.3, 3.0, 1.2)
SOM のネットワーク構造 出力層 出力ノード 重み 1.7 入力層 入力ノード 1 2 1.2 2.3 入力データ
入力データの提示 距離の計算 出力層 (a) 0.7 1.5 入力層 入力ノード 1 2 入力データ 1.2 2.3 距離 = (1.2 0.7) 2 + (2.3 1.5) 2 = 0.89
最小距離ノード j min の特定 出力層 j min (b) 1.1 1.9 入力層 入力ノード 1 2 入力データ 1.2 2.3
近傍ノード N jmin の特定 N jmin (c) 出力層 j min 1.1 1.9 2.1 2.5 入力層 入力ノード 1 2 入力データ 1.2 2.3
近傍ノード N jmin の重みの更新 N jmin (d) 出力層 j min 1.15 2.1 1.65 2.4 入力層 入力ノード 1 2 入力データ 1.2 2.3 入力ノード 1 と j min の新しい重み w 1,jmin = 1.1 + η(1.2-1.1) η=0.5 なら 1.15 となる入力データと重みの差
次々と入力データを変えて提示 出力層 w 入力層 入力ノード 1 2 入力データ入力データ入力データ 3.9 2.1 2.2 2.5 1.2 0.3 入力層から出力層への重み w を逐次変えてゆく N jmin の範囲を狭めてゆく η を小さくしてゆく 最終的には各入力データが所属する出力層のノードは最小距離ノードとなる
SOM による二次元へのマッピング # d1 d2 d3 0 4.0 5.0 2.0 1 4.1 5.2 2.3 2 70.0 70.0 70.0 3 4.3 5.0 2.1 4 20.0 21.0 22.0 5 3.8 5.3 2.0 6 1.0 2.0 3.0 7 5.0 4.0 3.0 8 1.0 3.0 3.0 9 1.0 2.1 3.1 10 5.1 4.1 3.1 11 1.1 3.1 3.1 12 50.0 34.0 13.0 13 45.0 32.0 15.0 14 49.0 51.0 21.0 15 3.9 5.0 2.1 16 21.0 22.0 23.0 17 23.0 24.0 25.0 18 25.0 26.0 27.0 19 4.5 5.1 2.2 (a) 3 19 7 10 2 0,15 5 1 11 16 14 8 6 17 9 4 13 18 12 (b)
遺伝子の発現のプロセス DNA ATG 遺伝子 TAA 転写 mrna AUG UAA 翻訳 タンパク質
タンパク質合成ー翻訳 コドン アミノ酸 タンパク質 システイン セリン スレオニン スレオニン trna mrna ACC ACGAGUACA UGCUCAUGUUGG
遺伝暗号表 UUU Phe (F) UCU Ser (S) UAU Tyr (Y) UGU Cys (C) UUC Phe (F) UCC Ser (S) UAC Tyr (Y) UGC Cys (C) UUA Leu (L) UCA Ser (S) UAA * UGA * UUG Leu (L) UCG Ser (S) UAG * UGG Trp (W) CUU Leu (L) CCU Pro (P) CAU His (H) CGU Arg (R) CUC Leu (L) CCC Pro (P) CAC His (H) CGC Arg (R) CUA Leu (L) CCA Pro (P) CAA Gln (Q) CGA Arg (R) CUG Leu (L) CCG Pro (P) CAG Gln (Q) CGG Arg (R) AUU Ile (I) ACU Thr (T) AAU Asn (N) AGU Ser (S) AUC Ile (I) ACC Thr (T) AAC Asn (N) AGC Ser (S) AUA Ile (I) ACA Thr (T) AAA Lys (K) AGA Arg (R) AUG Met (M) ACG Thr (T) AAG Lys (K) AGG Arg (R) GUU Val (V) GCU Ala (A) GAU Asp (D) GGU Gly (G) GUC Val (V) GCC Ala (A) GAC Asp (D) GGC Gly (G) GUA Val (V) GCA Ala (A) GAA Glu (E) GGA Gly (G) GUG Val (V) GCG Ala (A) GAG Glu (E) GGG Gly (G)
コドン使用の解析 遺伝子 A: atg acg agt acg taa 遺伝子 B: atg aac tac aac tag 遺伝子 C: atg aat aat aat taa.. atg=0.25, acg=0.5, agt=0.25 atg=0.25, aac=0.5, tac=0.25 atg=0.25, aat=0.75 各遺伝子のコドン使用は 61 次元のベクトルとして表現される aaa aac aag aat aca acg act.. 遺伝子 A=(0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0,..) 遺伝子 B=(0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0,..) 遺伝子 C=(0.0, 0.0, 0.0, 0.75,0.0, 0.0, 0.0,..) 様々な生物種の遺伝子のコドン使用を一斉に SOM にかけると
SOM によるコドン使用の解析 50 45 40 35 30 25 20 15 Bbur Bsub Buch Ctra Ecoli Hinf Hpyl Mgen Mtub Paer Tpal Vcho 10 5 0 0 5 10 15 20 25 30 35 40 45 50
Perl による SOM の実装 http://www.bioinfo.sfc.keio.ac.jp/class/bioin fo-a の本日の授業の箇所よりファイルをダウンロードし 解凍 ファイルを各自の作業ディレクトリに配置 RS_data_handler.pm 多次元データを扱うパッケージ rslib_som.pm SOM に有用な関数群 test1.pl 上記関数の使用サンプル testdata1.txt テストデータ
初期設定 #!/usr/bin/env perl use strict; use warnings; require Exporter; use RS_data_handler; use rslib_som qw(find_winner neighbour); *::X_LEN = 10; # 横のノード数 *::Y_LEN = 10; # 縦のノード数
データの読み込み # ファイル中のデータを扱うためのオブジェクト my $data_obj = new RS_data_handler "./testdata1.txt"; print Dimension:, $data_obj->dim(), n ; # データの次元数 print "Some input data: n"; for my $i (0..29){ # 次々と入力データを廻してデータラベルを $label データを @data に格納 my($label, @data) = $data_obj->next_data(); print join(" t", $label, @data), " n"; } print "All data: n"; # 全てのデータを一度に取り出す for my $data_ref (@{$data_obj->all_data()}){ my($label, @data) = @$data_ref; print join(" t", $label, @data), " n"; }
重みをランダムに振る my @w; # 入力層のノード $i から出力層 $j への重みは $w[$j]->[$i] として実装 # $j の X 座標は $x % $::X_LEN # $j の Y 座標は int($x / $::X_LEN) for(my $j = 0; $j < $::X_LEN * $::Y_LEN;$j ++){ for(my $i = 0;$i < $data_obj->dim();$i ++){ $w[$j]->[$i] = rand(); } }
最小距離ノードの決定 my($label, @data) = $data_obj->next_data(); my $min_j = find_winner( @data, @w); print "$min_j n";
近傍ユニットの特定 my @neighbours = neighbour($min_j, $range, $::X_LEN, $::Y_LEN); print "Neighbours: ", join(",", @neighbours), " n";
各データの最終的な 所属ノード ( 出力層 ) の出力 for my $data_ref (@{$data_obj->all_data()}){ } my($label, @data) = @$data_ref; my $min_j = find_winner( @data, @w); my $x = $min_j % $::X_LEN; my $y = int($min_j / $::X_LEN); print join(" t", $label, $min_j, $x, $y, @data), " n";