自己組織化マップ
自己組織化マップとは?
• 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 2入力データ
入力層 出力層 入力ノード 1.7 出力ノード 重み 1.2 2.3入力データの提示、距離の計算
入力データ
入力層 出力層 1.2 2.3 入力ノード 0.7 1.5 1 2 (a)距離 = (1.2 – 0.7)
2+ (2.3 – 1.5)
2= 0.89
最小距離ノードj
min
の特定
入力データ
入力層 出力層 1.2 2.3 入力ノード 1.1 1.9 1 2 jmin (b)近傍ノードN
jmin
の特定
入力データ
入力層 出力層 1.2 2.3 入力ノード 1.1 1.9 jminN
jmin 1 2 2.1 2.5 (c)近傍ノードN
jmin
の重みの更新
入力データ
入力層 出力層 1.2 2.3 入力ノード 1.15 2.1 jminN
jmin 1 2 1.65 2.4 (d) 入力ノード1とjminの新しい重みw1,jmin = 1.1 + η(1.2 - 1.1) η=0.5なら、1.15となる 入力データと重みの差次々と入力データを変えて提示
•
入力層から出力層への重みwを逐次変えてゆく
•
N
jminの範囲を狭めてゆく
•
ηを小さくしてゆく
•
最終的には各入力データが所属する出力層のノードは最小距
離ノードとなる
入力データ
入力層 出力層 3.9 2.1 入力ノード 1 2入力データ
入力データ
2.2 2.5 0.3 1.2w
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 3 19 7 10 2 0,15 5 1 11 16 14 8 6 17 9 4 13 18 12 (a) (b)遺伝子の発現のプロセス
遺伝子の発現のプロセス
DNA
ATGmRNA
AUG転写
翻訳
タンパク質
TAA遺伝子
UAAタンパク質合成
タンパク質合成
ー
ー
翻訳
翻訳
• コドン
• アミノ酸
UGCUCAUGUUGG
ACGAGUACA
システインセリン
スレオニンACC
スレオニンmRNA
tRNA
タンパク質
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によるコドン使用の解析
0 5 10 15 20 25 30 35 40 45 50 0 5 10 15 20 25 30 35 40 45 50 Bbur Bsub Buch Ctra Ecoli Hinf Hpyl Mgen Mtub Paer Tpal VchoPerlによる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; # 横のノード数
データの読み込み
# ファイル中のデータを扱うためのオブジェクト
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);
近傍ユニットの特定
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"; }