Location : Home > Languages > Perl > Package Title : AI::NeuralNet::Kohonen |
![]() |
AI::NeuralNet::Kohonen - Kohonen の自己組織化マップ
$_ = AI::NeuralNet::Kohonen->new( map_dim_x => 39, map_dim_y => 19, epochs => 100, table => "3 1 0 0 red 0 1 0 yellow 0 0 1 blue 0 1 1 cyan 1 1 0 yellow 1 .5 0 orange 1 .5 1 pink" ); $_->train; $_->save_file('mydata.txt'); exit;
コホーネンの自己組織化マップ(Kohonen's Self-organising Feature Maps)の Perl における実装である。高速ではないが有用である。実際、遅い。。。でも役に立つから。。
マップの可視化の例については AI::NeuralNet::Kohonen::Demo::RGB を見よ。
いずれここに文書を追加するかも。
AI::NeuralNet::Kohonen::Node
AI::NeuralNet::Kohonen::Input
なし
以下のオブジェクトフィールドを初期化する。
input_file
SOM_PAK はロードされるべき学習ファイルである。これは進行中の他の入力メソッド(input, table)を阻害しないがコンストラクタに明示的に渡されるべき特性(weight_dim)を上書きする。
ファイルフォーマット及び METHOD load_input を見よ。
input
学習ベクトルの配列への参照で、各ベクトルは以下の配列によって表される。
[ [v1a, v1b, v1c], [v2a,v2b,v2c], ..., [vNa,vNb,vNc] ]
table も参照のこと。
table
input_file フィールドに供給されるフォーマットを持ったファイルの内容。
input_names
input ベクトルの各次元の名称。
map_dim_x
map_dim_y
生成すべき特徴マップの次元−デフォルトは19。(これは Perl の添え字付けで0から始まることに注意。)
epochs
実行時のエポック(epoch)数。(METHOD train を見よ。)最小値は1。
learning_rate
学習率の初期値。
train_start
学習開始時において呼び出されるコードへの参照。
epoch_start
各エポック開始時において呼び出されるべきコードへの参照(カラーキャリブレーションルーチンなど)。
epoch_end
各エポック終了時において呼び出されるべきコードへの参照(ディスプレールーチンなど)。
train_end
学習終了時において呼び出されるべきコードへの参照。
targeting
未定義であればランダムに目標が選択される。そうでなければ到達するまで繰り返し実行される。現実的な目的のためである。
smoothing
smooth が適用されたときはデフォルトで適用されるスムージングの回数。(METHOD smoothを見よ。)
neighbour_factor
影響の近傍サイズが終了した後は、指数関数が適用される前にマップの次元の平均はこの変数で除される。デフォルト値は 2.5 であるが 2 か 4 がよいだろう。
missing_mask
入力ベクトルにおいて欠損値を示すために用いられる。デフォルトは x である。
プライベートフィールド:
time_constant
終了すべき繰り返し(エポック)の数。マップ半径の対数以上であること。
t
現在のエポックまたはモーメント。
l
現在の学習率。
map_dim_a
マップ次元の平均。
実数の乱数を含むノードを map に投入する。
AI::NerualNet::Kohonen::Node/CONSTRUCTOR new を見よ。
METHOD randomise_map と同様であるが、あらゆる map のノードにパラメータにより提供された値または undef を設定する。
学習されるべきエポックの数であるパラメータをオプションで受け取る。デフォルト値はepochs フィールドの値である。エポックは生成の数・入力ベクトルの全数から構成される。全ての生成で以下の処理を繰り返す。
各生成の終了時に学習率は減衰する。(PRIVATE METHOD _decay_learning_rate を見よ。)
また適用可能なコールバックの詳細については CONSTRUCTOR new を見よ。
真値を返す。
特定の目標に対し、マップ内から最適適合単位(BMU; Best Matching Unit)を探索し、 x/y のインデクスを返す。
入力:目標となる配列への参照
返り値: BMU となる配列への参照(それ自体オブジェクトとして抽出されているものとする)で、以下のようにインデクスが付けられている。
METHOD get_weight_at, AI::NeuralNet::Kohonen::Node/distance_from を見よ。
提供された x, y 座標における重み配列への参照を返す。
入力:x, y 座標(スカラー)
返り値:ノードの重みである配列への参照。失敗時には undef を返す。
提供された配列の配列への参照におけるあらゆり入力ベクトルに対する結果を探索し、result フィールド(配列参照)を更新して返す。呼び出し時のコンテキストによって配列またはそれ自体を返す。
入力ベクトルが指定されなければ input フィールドの値を用いる。
個々の結果値は METHOD find_bmu で記述された配列フォーマットである。
METHOD find_bmu, METHOD get_weight_at を見よ。
map をクリアし結果で埋める。
パラメータのみが METHOD clear_map に渡される。
METHOD get_results が呼び出され、結果がオブジェクトフィールド map に渡されて返される。
.
フィールドの再使用に関する誤解のためにこれは変更されるかも知れない。
現在の重み値をスクリーンに表示する。
マップに対しガウス平滑化を適用する。
入力:適用する正方ガウスマスクの横幅。もし指定されなければフィールド smoothing の値を使用する。空であればマップ次元 map_dim_a の平均の平方根を用いる。
返り値:真値。
入力ベクトルの SOM_PAKformat フォーマットファイルを呼び出す。本メソッドは、コンストラクタが input_file フィールドを指定した場合、自動的にアクセスされる。
必要:ファイルへのパス。
返り値:失敗時には undef を返す。
ファイルフォーマット を見よ。
第1引数で特定されたパスに SOM_PAK フォーマットでマップファイルを保存する。(METHOD load_input を見よ。)失敗時には undef を、成功時には true を返す。
フィールドが定義されていない限り目標を繰り返し探索する際に input フィールドにおいて設定された学習集合から目標をランダムに返す。
PRIVATE METHOD _adjust_neighbours_of
入力:目標から BMU までの距離を含む配列への参照。マップにおける BMU の x座標と y座標及び AI::NeuralNet::Kohonen::Input オブジェクトである目標への参照。
返り値:真値
FINDING THE NEIGHBOURS OF THE BMU
( t ) sigma(t) = sigma(0) exp ( - ------ ) ( lambda )
ただし sigma は time (t) における任意のステージのマップの幅であり、lambda は時定数である。Lambda は time_constant フィールドである。
マップハ半径はマップ幅の半分である。
ADJUSTING THE NEIGHBOURS OF THE BMU
W(t+1) = W(t) + THETA(t) L(t)( V(t)-W(t) )
ただし、L は学習率、V は目標ベクトル、W は重みである。THETA(t) はノードでの学習における BMU からの距離の影響を示す。これは Node クラスにより計算される。AI::NeuralNet::Kohonen::Node/distance_effect を見よ。
PRIVATE METHOD _decay_learning_rate
学習率におけるガウス減衰を計算する。( l フィールド)
( t ) L(t) = L exp ( - ------ ) 0 ( lambda )
PRIVATE FUNCTION _make_gaussian_mask
入力:マスクのサイズ
返り値:マスクである2次元配列への参照
PRIVATE FUNCTION _gauss_weight
入力:2つのパラメータがあり、1つめはマスク中心からの距離を与える r であり、2つめはマスクの幅を示す sigma である。
返り値:ガウスの重み
_decay_learning_rate を見よ。
提供された点またはそれらの input フィールドにおける量子化誤差を返す。
PRIVATE METHOD _add_input_from_str
input フィールドに SOM_PAK フォーマットの空白で区切られた ASCII 文字列の入力ベクトルを追加する。
追加に失敗したときには undef を返し(おそらくコメントが渡された場合や weight_dim フラグが設定されていないため)、成功時には真値を返す。
本モジュールはヘルシンキ工科大学の制定した SOM_PAK フォーマット:SOM_PAK file format version 3.1 (April 7, 1995) に適合するように作成されている。すなわち
入力データは ASCII データで格納され、1行にそれぞれベクトルが格納されている。
ファイルの最初の行はエントリーの状態に関する記述のために確保されている。以前のバージョンでは以下の項目の定義のために用いられていた。(これらはインデクス化さえた順に格納されねばならない。)
...
続く行はオプションのクラスラベル(文字列)及び学習プログラムにおける対応するデータエントリーの使用方法を定義する2つのオプションの識別子(後述)が続く固定点の数字からなる。データファイルは # から始まる任意の行数のコメントを含むことができる。(ただし各コメント行の冒頭には # が必要。)
ベクトルの要素に欠損があれば(何かの理由でデータ収集に失敗していれば)、それは x で表現されていなければならない。その場合は処理上無視される。
...
各データ行は学習プログラムにおける対応するデータエントリーの使用方法を定義する2つのオプションの識別子を含むことができる。識別子は codeword=value という形式であり、識別子内に空白は許されない。オプションの識別子は以下の通り。
(まだ)ファイルフォーマットでは実装されていないもの
AI::NeuralNet::Kohonen::Node/distance_from; AI::NeuralNet::Kohonen::Demo::RGB を見よ。
利用する/しないにかかわらず、マップ構築の際の多くの助言に満ちている SOM_PAK 用ドキュメントftp://cochlea.hut.fi/pub/som_pak を見よ。
Kohonen のアルゴリズムに関する非常に良い説明としては AI-Junkie SOM tutorial part 1 を見よ。
This implimentation Copyright (C) Lee Goddard, 2003-2006. All Rights Reserved.
Perl 本体と同等の条件で利用可能である。
![]() |
Updated : 2007/09/12 |