SOMアルゴリズムとは?自己組織化マップの仕組みと手順を徹底解説
SOMアルゴリズムとは
SOMは「Self-Organizing Feature Map(自己組織化特徴マップ)」の略称で、ニューラルネットワークの考え方に基づくクラスタリングおよびデータ可視化の手法です。ニューラルネットワークを基盤としているものの、プロトタイプベースのクラスタリングの変形として捉えれば、その仕組みは非常にシンプルに理解できます。
SOMアルゴリズムの基本的な流れ
SOMアルゴリズムの手順は以下の通りです。
- 重心(セントロイド)を初期化する。
- 以下を繰り返す。
- 次のオブジェクトを選択する。
- そのオブジェクトに最も近い重心を特定する。
- 該当する重心と、所定の近傍範囲内にある他の重心を更新する。
- 重心がほとんど変化しなくなるか、閾値に達するまで上記を繰り返す。
- 各オブジェクトを最も近い重心に割り当て、最終的な重心とクラスタを出力する。
初期化
このステップ(1行目)は、複数の方法で実装できます。一つ目は、データ中で観測される値の範囲から、重心の各要素をランダムに選ぶ方法です。しかし、この方法は動作こそするものの、必ずしも最適ではなく、特に迅速な収束を実現するのには向いていません。もう一つの方法は、利用可能なデータ点の中から初期重心をランダムに選択する方法です。これは、K-meansにおける重心のランダム選択とよく似ています。
オブジェクトの選択
ループの最初のステップ(3行目)は、次のオブジェクトの選択です。一見単純ですが、いくつか注意すべき点があります。収束には複数回の反復が必要となるため、特にオブジェクト数が少ない場合には、同じデータオブジェクトが何度も使用されることがあります。逆に、オブジェクト数が多い場合は、すべてのオブジェクトを使用する必要はありません。さらに、訓練セットにおける出現頻度を調整することで、特定のグループのオブジェクトの影響力を強めることも可能です。
割り当て
最近傍重心の決定(4行目)は容易ですが、距離指標の定義が必要です。一般的にはユークリッド距離や内積(ドット積)指標が用いられます。内積距離を使用する場合は、データベクトルを事前に正規化し、参照ベクトルは毎ステップで正規化するのが通例です。このようにすれば、内積指標の使用はコサイン類似度(コサイン測度)の使用と等価になります。
更新
更新ステップ(5行目)が最も難しい部分です。m1, ..., mk を重心とし、時刻 t における現在のオブジェクト(点)を p(t)、p(t) に最も近い重心を mj とすると、時刻 t+1 における j 番目の重心は次の式で更新されます。
mj(t + 1) = mj(t) + hj(t)(p(t) − mj(t))
ここで hj(t) は時間とともに変化する学習係数(近傍関数)であり、反復が進むにつれて値を小さくしていくことで、更新幅を徐々に縮小させます。これにより、初期段階では大まかな構造を形成し、後半では細かい調整を行うという動作が実現します。
終了条件
いつ「十分に安定した重心の集合」に到達したと判断するかは、重要な課題です。理想としては、収束が確認できるまで、すなわち参照ベクトルがまったく変化しなくなるか、ごく僅かにしか変化しなくなるまで反復を続けるべきです。ただし、収束にかかるコストは、データの性質や学習率 α(t) をはじめとする複数の要因に依存するため、実用的には計算量とのバランスを考慮した終了基準の設定が求められます。
-
C言語のトークンとは?種類と基本構成要素をサンプルコード付きで解説
C言語のプログラムは命令文(ステートメント)の集まりであり、さらにその命令文一つひとつは、より小さな単位の集合によって構成されています。このように、Cプログラムを構成する個々の小さな単位のことを「トークン(token)」と呼びます。つまり、Cプログラム内のすべての命令文は、複数のトークンが集まってできているということです。トークンはCプログラムを作り上げるための材料であり、「プログラムの基本的な構成要素(ビルディングブロック)」とも表現されます。Cプログラムにおけるトークンの種類Cプログラムの中で扱われるトークンには、主に以下の7種類があります。キーワード(予約語):int、if、for、re
-
C#のコメントとは?複数行・単一行コメントの書き方を解説
コメントは、コードの内容や意図を説明するために記述する注釈です。コンパイラはコメント部分を完全に無視するため、プログラムの動作には一切影響しません。C#では、複数行にわたるコメントは「/*」で始まり、「*/」で終わります。 複数行コメント /* 以下はC#における 複数行コメントの例です */ 「/* ... */」で囲まれた範囲はすべてコンパイラによって無視されます。処理の概要や注意点など、複数行にわたる説明を残したい場合に使用します。 単一行コメント // 変数の宣言 int a = 10; 単一行コメントは「//」から行末までがコメントとして扱われます。変数の意味や処理の意図を手軽にメモ