自己組織化マップ

SOM (self-organizing map) は日本語で自己組織化マップと訳される。教師なし学習を行うニュートラルネットワークの 1 種である。SOM は n 次元のベクトルを平面(二次元配列)に写像する方法である。

R では som, class, kohonen などのパッケージに実装されている。また、Python では PyMVPA などのモジュールに実装されている。

References

  • R. Wehrens and L.M.C. Buydens. Self- and Super-organising Maps in R: the kohonen package. J. Stat. Softw. 2007, 21:5. J. Stat. Softw.
  • Kohonen, T. Self-Organiziing Maps. Springer. 1997.

アルゴリズム

入力ベクトル

入力ベクトル p としては実数からなる n 次元のベクトルを用いる。例えば、ある遺伝子のコドンの出現確率あるいはアミノ酸の出現確率などでもよい。ここでは、ある細菌叢から 16SrRNA をシーケンシングした結果、Q 本の 16SrRNA が得られたと想定する。次に、 Q 本の 16SrRNA の核酸配列のシグネチャベクトルを計算する。シグネチャベクトルは、たとえば核酸配列の 3 塩基ずつの出現確率にしてもよい、この場合、シグネチャベクトルは 43 = 64 次元のベクトルになる。このシグネチャベクトルを入力ベクトルとする。

シーケンシングされた 16SrRNA の配列は Q 本あるので、入力ベクトルも Q 個存在する。それぞれ、p1, p2, ..., pQ とする。

\[ \mathbf{P} = \begin{bmatrix} \mathbf{p}_{1} & \mathbf{p}_{2} & \dots & \mathbf{p}_{Q} \end{bmatrix} = \begin{bmatrix} p_{1}(AAA) & p_{2}(AAA) & \dots & p_{Q}(AAA) \\ p_{1}(AAC) & p_{2}(AAC) & \dots & p_{Q}(AAC) \\ p_{1}(AAG) & p_{2}(AAG) & \dots & p_{Q}(AAG) \\ \vdots & \vdots & \ddots & \vdots \\ p_{1}(UUU) & p_{2}UUU) & \dots & p_{Q}(UUU) \end{bmatrix} \]

出力層

入力ベクトルの準備を済ませた後に、SOM の出力層について準備する。SOM は n 次元の入力ベクトルを平面に写像するので、その平面の範囲を予めに決める必要がある。ここで二次元空間を u × v の個の正方形に分割するものとする。こうして分割した u × v 個の領域には、それぞれ自身の状態を表すベクトルを持つ。ここで各領域に添え字 k = 1, 2, ..., uv をつける。例えば、k 番目の領域には n 次元のベクトル mk を持つ。

\[ \mathbf{M} = \begin{bmatrix} \mathbf{m}_{1} & \mathbf{m}_{2} & \dots & \mathbf{m}_{k} & \dots & \mathbf{m}_{uv} \end{bmatrix} = \begin{bmatrix} \mu_{11} & \mu_{12} & \dots & \mu_{1k} & \dots & \mu_{1uv} \\ \mu_{21} & \mu_{22} & \dots & \mu_{1k} & \dots & \mu_{1uv} \\ \dots & \dots & \dots & \dots & \ddots & \dots \\ \mu_{Q1} & \mu_{Q2} & \dots & \mu_{Qk} & \dots & \mu_{Quv} \end{bmatrix} \]

出力層の各参照ベクトル mk (k = 1, 2, ..., uv) の初期値はランダムに決めるか、入力ベクトル P から計算して決められる。

SOM アルゴリズム

入力ベクトルと出力層の準備を整えた後に、SOM のアルゴリズムを利用して学習を始める。

  1. j = 1 とする。
  2. 入力ベクトル Pj と出力層にあるすべての参照ベクトル mk (k = 1, 2, ..., uv) のユーグリッド距離を計算し、最小距離を与える k を c とする。すなわち、
    \[ c = \arg\min_{j}\{ || \mathbf{p}_{j} - \mathbf{m}_{k} || \} \]
  3. 出力層にあるすべての参照ベクトルを次の式に基づいて更新する。
    \[ \mathbf{m}^{(new)}_{k} = \mathbf{m}^{(old)}_{k} + h_{ck} (\mathbf{p}_{j} - \mathbf{m}^{(old)}_{k}) \]
    hck 関数は、c 領域の周辺では 0 以外の値を取り、c から離れた領域では 0 をとる近傍関数である。
  4. j を 1 増やして、j = Q になるまで手順 2 ~ 4 を繰り返す。

学習の結果

Q 個の入力ベクトルをすべて用いて、学習したのちに、最新の参照ベクトル M' が得られる。最後に、Q 個の入力ベクトルと M' との距離を計算し、その距離をみてクラスタリングする。例えば、prm's のとき距離が最小ならば、入力ベクトル pr は s 番目のクラスタ属することになる。

ここで、最初に想定した例を考えると、もし a 番目と b 番目の 16SrRNA が同じ微生物に由来するのであれば、papb が同じクラスタに分けられる(と期待できる)。

その他

SOM のアルゴリズムは上で紹介したアルゴリズムとなる。このアルゴリズムを拡張された方法も多様にある。

  • 出力層は正方形ではなく、正六角形や球面にする方法もある。
  • 入力ベクトルと参照ベクトルの距離はユーグリッド距離以外でもよい。
  • 近傍関数はには様々なものが存在する。