INGOR
INGOR チュートリアル

はじめに

INGOR はベイジアンネットワーク推定ソフトウェアです。多変量の計測データからベイジアンネットワークを推定します。

入力データファイル

ネットワーク推定で用いられる多変量計測データは入力データファイルとして指定します。 INGOR では GDF および EDF の二つの形式に対応しています。EDF は SiGN-BN で使用していた入力ファイルフォーマットです。詳細は SiGN-BN 用のドキュメントをご参照ください。

GDF は INGOR 用に EDF を拡張した入力データフォーマットで、以下の特徴があります。

  • タブ区切りのテキストファイル
  • 行列の意味の入れ替えが自由。基本は行がサンプル、列が変数という一般的なフォーマットになっています。(SiGN-BNでは逆の行が変数、列がサンプル)
  • 離散・連続データを混合可能。

EDF ファイルを読み込む場合 -I オプションに edf を指定してください。 読み込み時の設定が EDF 用に全て切り替わります。ただし、シンプルな形式で書かれた EDF ファイルは GDF と互換性がありますので、そのまま何も指定せずに読み込むことができます。

その他、詳細は GDF 読み書き関数のプログラミングドキュメントをみてください。-I オプションにさまざまな値を渡すことで入力ファイル読み込み時のオプションを指定できます。

サンプルファイルが用意されています。インストール場所は各自のシステムの管理者にお尋ねください。

  • sample001-p50.ing : 50 変数のネットワークファイル
  • sample001-p50-n100.txt : 上記のファイルより作成した 100 サンプルの GDF ファイル。

Greedy Hill-climbing HC アルゴリズムによる実行方法

指定可能なオプションの詳細は INGOR Manual をご覧ください。

ブートストラップ法を用いないネットワーク推定

シェルなどから ingor コマンドを実行します。INGOR の配布バージョンによってはコマンド名にリリース番号やビルド(コンパイル)時の仕様を表す記号がついています。その場合、ingor.1.0.0ingor.1.0.0-MPI のようなコマンド名をしています。この場合、 1.0.0 がリリース(バージョン)番号です。以下の説明ではコマンド名として ingor を用いますので適宜読み替えてください。

基本的なコマンド実行書式は以下の通りです。

$ ingor [ options ] input_file -t file_type -o output_file

(先頭の "$" はシェルプロンプトです)

  • input_file : GDF 形式による入力データファイル名
  • output_file : 出力ネットワークファイル名
  • file_type : 出力ネットワークファイル形式。指定可能な形式一覧は Network File Formats をみてください。 出力ネットワークファイル名にネットワークファイル形式と同一の拡張子が付いている場合に限り、自動認識されますので省略可能です。

これらの指定に順番はありません。ただし、同一の指示は後に指定した設定が優先されます。また、フィルターと呼ばれる機能を呼び出すオプションを指定した場合、ネットワーク推定後に、出現順にそれらのフィルターが実行されます。

サンプルデータ実行例: この例は 50 変数のサンプルデータからネットワークを推定し、 CompFilter (comp フィルター) を用いて、真の構造である sample001-p50.ing と推定結果を比較します。 比較結果は標準エラーに出力されます。推定したネットワークは TXT 形式result.txt というファイル名で保存します。フィルターについては次節を参照ください。

$ ingor sample001-p50-n100.txt -o result.txt --comp file=sample001-p50.ing

フィルターについて

フィルターは推定されたネットワークなどに対してさまざまな処理を行う機能です。さまざまな種類のフィルターが用意されています。実行時のオプションにフィルターを指定すると、ネットワーク推定後にそのフィルターに推定後のネットワークが渡され処理されます。複数のフィルターを指定すると、順番に処理されていきます。

ingor コマンド実行時に、入力ファイルを指定しない場合、空ネットワークが推定されたとみなされます。ネットワークをファイルから読み込むフィルターを使用することで、ネットワーク推定の代わりにすでにあるネットワークに対してフィルター処理が可能です。例えば、ネットワークファイルのフォーマット変換は次の様に行うことができます。

$ ingor --read file=input.txt -o output.ing

フィルターの一覧は Filters を参照ください。

ブートストラップ法

ブートストラップ法によるネットワーク推定では、 まず(1)ブートストラップ・リサンプリングを行いながら複数のネットワークを推定し、その後 (2)推定した複数のネットワークを1つのネットワークとしてまとめる処理、の2段階の実行が必要です。

ブートストラップ法によるネットワーク推定を実行するには -B i および -N n オプションを指定します。 引数 i は同時に複数のプロセスを実行する時に、 それぞれの実行を区別するための番号で、1 以上の整数を指定してください。 出力されるファイル名の末尾にこの番号がつきます。 引数 n で1つのプロセスで推定する回数を指定します。 出力フォーマットには SGN3 形式が今の所、確実です。

$ ingor [ options ] -B i -N n input_file -t sgn3 -o prefix

この場合、出力ファイル名は "prefix.000001" となります。 このファイルに、-N で指定した繰り返し数分のネットワークが出力されます。 推定された個々のネットワークをそれぞれ別のファイルに出力するには "--single-file off" を指定してください。

ネットワーク推定時に B-spline 係数についてもブートストラップ計算を行いたい場合は "--fix-range" オプションを使用してください。

ブートストラップ時に回帰曲線描画用データ出力オプションである "--output-data" は使用しないでください。

シングルプロセスでの実行

実行例:

$ ingor -B 1 -N 1000 -o result -t sgn3 sample001-p50-n100.txt

この例では 1000 回のブートストラップを行い結果をファイル result.000001 に保存します。

まとめ処理

ブートストラップを実行後、まとめ処理が必要です。 ブートストラップまとめ処理はBSFilter (--bs) で行うことができます。

$ ingor --bs prefix=result,type=sgn3,ed=1 -o output.txt

複数シングルプロセスによる並列実行

複数のプロセスを実行することでブートストラップによるネットワーク推定を高速に行うことが可能です。 -B オプションに指定する番号を連番にして複数プロセスで実行してください。 並列処理が可能です。 以下、1000 回のブートストラップ処理を 4 つのプロセスで並列処理する場合の実行例です。

$ ingor -B 1 -N 250 -o result -t sgn3 sample001-p50-n100.txt &
$ ingor -B 2 -N 250 -o result -t sgn3 sample001-p50-n100.txt &
$ ingor -B 3 -N 250 -o result -t sgn3 sample001-p50-n100.txt &
$ ingor -B 4 -N 250 -o result -t sgn3 sample001-p50-n100.txt &

末尾の "&" はシェルでコマンド実行する際にバックグラウンドで行うための指定です。

自動的に result の末尾に "." と -B オプションで指定した番号が 6 桁の数字として出力ファイル名につきます。 この例ですと result.000001 から result.000004 までとなります。

複数プロセス実行時に "--single-file off" を指定していても、 出力ファイル名の末尾番号は重複しないように出力されます。つまり、 上記例で、2番目のプロセスは 251 から 500 番までの番号を自動で付加します。

プロセス数は使用する計算機の CPU core 数やスレッド数を上限としてください。 それ以上プロセス数を増やしても、高速化されません。

※注意:PC クラスタシステムなどのログインノードで複数プロセスによる実行や時間のかかる計算を行うことは避けましょう。

Grid Engine 環境でのブートストラップ法の実行

Grid Engine は PC クラスタ向けのジョブ管理システムで、上記のような並列処理を、 空いている計算ノード・CPUを見つけて自動的に実行することができます。 Grid Engine のアレイジョブ機能を用いることで、ブートストラップ実行を1回のジョブで並列実行させることができます。 その際に、ジョブスクリプト中で $SGE_TASK_ID 変数を -B オプションに渡してください。 アレイジョブとして実行されたジョブのそれぞれのタスク ID が実行時に指定されます。以下は、ジョブスクリプト中の記載例です。

ingor -B ${SGE_TASK_ID} input.txt -t sgn3 -o output.sgn3

ジョブ投入時にブートストラップ回数を qsub コマンドにアレイジョブの指定である -t オプションを指定してジョブスクリプトの投入をしてください。

$ qsub -t 1-1000 jobscript.sh

この例は、1000 回のブートストラップ実行を行います。ジョブ完了後のまとめ処理についてはシングルプロセスでの実行方法と同様に BSFilter を使用してください。

MPI を使用したブートストラップ法の実行

MPI を用いたマルチプロセス実行によるブートストラップ法の実行が可能です。その場合、mpirun コマンド経由で INGOR を実行します。また、-a hc オプションを明示的に指定してください。

$ mpirun -np 2 ingor -B 1 -N 10 -a hc -o result.sgn3 input.txt

この例では、2 プロセスを使用してブートストラップ回数 10 回でネットワーク推定を行います。それぞれのプロセスごとにネットワークがまとめられて出力されます。ファイルの末尾に 1 から始まる 6 桁のプロセス番号がつきます。上の例では result.sgn3.000001result.sgn3.0000002 になります。これらのファイルは BSFilter でこれまで同様にまとめ処理が可能ですのでおこなってください。

ダイナミックモデル使用時のブートストラップについて

SiGN-BN でのダイナミックモデルでは同一時刻の別サンプル(いわゆるリプリケート)をリサンプリングする 「擬似ブートストラップ法」のみが利用可能でしたが、INGOR では同一実験(リプリート)や同一個人単位、 つまり、同一プライマリー ID 単位でのリサンプリングができるようになりました (いわゆるブロックサンプリングの一種)。--B-mode オプションに pid を指定すると、 このプライマリーIDのリサンプリングになります。リサンプルする ID (ブロック)数は --blocks で指定できます。この場合、1回のネットワーク推定で使われる総サンプル数は T × N になります。 ただし T はタイムポイント数、N はブロック数です。

まとめ処理時、 BSFilterdynamic オプションを指定してください。

NNSR アルゴリズムによる実行方法

NNSR (Neighbor Node Sampling & Repeat) アルゴリズムは 10,000 変数を超えるネットワーク推定が可能なアルゴリズムです。MPI での並列実行にのみ対応しています。1000 変数を超える巨大なネットワーク推定には NNSR 法の使用を検討してください。

$ mpirun -np 32 ingor -a nnsr -A T=100000,th=0.2 -o result.ing input.txt

この例では NNSR アルゴリズムの繰り返し数 T パラメータを 100000、出力ネットワークの枝頻度の閾値 th パラメータを 0.2 で実行する例です。

NNSR アルゴリズムでは乱数を内部的に使用しています。安定的な結果を得るためには T パラメータ(繰り返し数)の設定が重要です。入力データのサンプル数が少ない場合やノイズが多く含まれるデータに対し小さい T パラメータで実行すると、結果が不安定となり実行のたびに異なる出力結果が得られます。その場合、十分に大きな T を指定すれば結果は安定します。

T パラメータが十分な大きさかどうかは、複数回、同一のデータセット、パラメータで推定して、結果を比較することで判断が可能です。比較には CompFilter が使用できます。比較の結果で得られる Sn の値が 0.95 以上であれば、同様のネットワークが推定されている、と見做せます。



INGOR 日本語ドキュメント | INGOR Manual