# ``gp_simulation_animation_tkbo.py`` ドキュメント
## 1. ファイル概要 (``gp_simulation_animation_tkbo.py``)
### 目的
このPythonスクリプトは、 ``tkbo`` ライブラリを使用して1次元のBayesian Optimizationシミュレーションをアニメーションとして視覚化することを目的としています。真の目的関数 ``f_true`` を定義し、様々なモデル(ガウス過程回帰、PhysBO、ランダムなど)とAcquisition関数(UCB、EI、PI、Steinなど)を試すことができます。シミュレーションの進行状況は ``matplotlib`` を用いてアニメーションとして描画され、GIFファイルとして保存したり、リアルタイムで表示したりできます。
### 主な機能
* **真の目的関数の定義**: シミュレーションで使用される1次元の目的関数 ``f_true()`` を定義します。
* **カスタムAcquisition関数の実装**: ポステリア平均の最大化を行う ``MeanAcquisition`` クラスを実装し、 ``tkbo`` に登録します。
* **コマンドライン引数処理**: ``argparse`` を使用して、シミュレーションモード、モデル、最大イテレーション数、出力ファイル名などの詳細な設定をコマンドラインから指定できるようにします。
* **``tkbo`` による最適化**: 指定されたモデルとAcquisition関数に基づき、 ``tkbo.create_optimizer()`` を用いてBayesian Optimizationのオプティマイザを構築・実行します。
* **アニメーション生成**: ``matplotlib.animation.FuncAnimation`` を使用して、各評価ステップでのGP予測、Acquisitionスコア、観測点、次の評価点を視覚的に更新するアニメーションを生成します。
* **GIF保存と表示**: 生成されたアニメーションをGIFファイルとして保存したり、ウィンドウに表示したりする機能を提供します。
### 非標準ライブラリ
このスクリプトは以下の非標準ライブラリに依存しています。
* ``numpy``
* ``matplotlib``
* ``scikit-learn`` (``sklearn.exceptions.ConvergenceWarning``)
* ``tkbo``
### 実行例
以下は、このスクリプトの典型的な実行例です。
```bash
python gp_simulation_animation_tkbo.py --mode ucb --model sklearn_gpr --nmaxiter 120 --save 0 --show 1
python gp_simulation_animation_tkbo.py --mode ei --model sklearn_gpr --nmaxiter 120 --save 0 --show 1
python gp_simulation_animation_tkbo.py --mode stein --model physbo_gp --nmaxiter 120 --save 0 --show 1
python gp_simulation_animation_tkbo.py --model physbo --acquisition EI --nmaxiter 120 --save 0 --show 1
python gp_simulation_animation_tkbo.py --model random --nmaxiter 120 --save 0 --show 1
python gp_simulation_animation_tkbo.py --model random --nmaxiter 20 --outfile random.gif
2. クラス
MeanAcquisition
ポステリア平均を最大化する候補点を選択するためのカスタムAcquisition関数です。 tkbo.base.BaseAcquisition を継承しています。
継承元:
tkbo.base.BaseAcquisition登録名:
"mean"および"max"
属性
name:"mean"(Acquisition関数の識別名)
メソッド
__call__(self, X, mean, std, y_observed=None, observed_mask=None, maximize=True, **kwargs)目的: 予測平均に基づいてスコアを計算します。
引数:
X: 候補点の入力データ(コードからは具体的な使用箇所は確認できません)。mean: 各候補点の予測平均 (np.ndarray)。std: 各候補点の予測標準偏差(コードからは具体的な使用箇所は確認できません)。y_observed: 観測された目標値(コードからは具体的な使用箇所は確認できません)。observed_mask: 観測された点のマスク(コードからは具体的な使用箇所は確認できません)。maximize: ブール値。Trueの場合、予測平均をそのままスコアとして返します。Falseの場合、予測平均の負の値を返します。デフォルトはTrueです。**kwargs: その他のキーワード引数。
戻り値: 各候補点のスコア (
np.ndarray)。maximizeがTrueならmeanと同じ値、Falseなら-meanと同じ値。
3. 関数
f_true
シミュレーションの真の目的関数を定義します。
目的:
np.sin(2 * np.pi * x) + 0.3 * np.cos(4 * np.pi * x)の関数値を計算します。引数:
x: 入力値 (np.ndarrayまたはfloat)。
戻り値: 計算された関数値 (
np.ndarrayまたはfloat)。
build_parser
コマンドライン引数を定義するための argparse.ArgumentParser オブジェクトを構築します。
目的: スクリプトが受け入れるコマンドライン引数の定義とヘルプメッセージの設定を行います。
引数: なし。
戻り値: 設定済みの
argparse.ArgumentParserオブジェクト。
normalize_args
解析されたコマンドライン引数を正規化します。
目的: 後方互換性のために位置引数をキーワード引数にマッピングし、特定の文字列引数を小文字に変換します。
引数:
args:argparse.Namespaceオブジェクト。build_parser()によって解析された引数が格納されています。
戻り値: 正規化された
argparse.Namespaceオブジェクト。
infer_acquisition_from_mode
--mode 引数に基づいて、 tkbo が認識するAcquisition関数名を推測します。
目的: ユーザーが指定した
--mode文字列を、内部で利用されるAcquisition関数名に変換します。引数:
mode:str。コマンドライン引数--modeの値。
戻り値: 推測されたAcquisition関数名 (
str)。例外:
ValueError: 未知のmodeが指定された場合。
effective_model
実効的なモデル名を決定します。
目的:
--modeが"random"または"grid"の場合、モデル選択がこれらのモードに上書きされるため、その実効的なモデル名を返します。それ以外の場合は--model引数の値を返します。引数:
args:argparse.Namespaceオブジェクト。
戻り値: 実効的なモデル名 (
str)。
acquisition_kwargs
特定のAcquisition関数が必要とする追加のパラメータを辞書として返します。
目的:
--modeまたは--acquisitionで指定されたAcquisition関数に応じて、必要なキーワード引数を構築します。例えば、UCB や LCB はkappaパラメータを使用します。引数:
acquisition:str。Acquisition関数名。args:argparse.Namespaceオブジェクト。
戻り値: Acquisition関数に渡されるキーワード引数の辞書 (
dict)。
make_optimizer
Bayesian Optimizationのオプティマイザを構築し、初期化します。
目的: コマンドライン引数と現在の観測データに基づいて、
tkbo.create_optimizer()を呼び出し、適切なオプティマイザインスタンスを生成・初期化します。プロット用の特別な設定(for_plot=True)も考慮します。引数:
X_candidates: 候補点の入力データ (np.ndarray)。y_all: 全候補点に対する観測値。未観測の点はnp.nan(np.ndarray)。args:argparse.Namespaceオブジェクト。for_plot: ブール値。Trueの場合、プロット目的でモデルが変更される可能性があります。デフォルトはFalseです。
戻り値: 初期化された
tkboのオプティマイザオブジェクト。例外:
ValueError:--model physboがacquisition=meanをサポートしない場合、またはサポートされていないAcquisition関数が指定された場合。ValueError: 未知の--modelが指定された場合。
choose_next_index
次に評価すべき候補点のインデックスを選択します。
目的: 現在の観測データとオプティマイザの戦略に基づいて、次に評価すべき候補点のインデックスを決定します。最初の点はランダムに選択されます。
引数:
X_candidates: 候補点の入力データ (np.ndarray)。y_all: 全候補点に対する観測値。未観測の点はnp.nan(np.ndarray)。rng: 乱数生成器 (np.random.Generator)。args:argparse.Namespaceオブジェクト。
戻り値: 選択された候補点のインデックス (
int)。例外:
RuntimeError: 未観測の候補点が残っていない場合。RuntimeError:tkboが候補点を返さなかった場合。
normalize_score_for_color
スコアをプロットの色付け用に0から1の範囲に正規化します。
目的: Acquisitionスコアを、プロットのカラーマップに適した0から1の浮動小数点値に変換します。
NaNや無限大の値、スコアの範囲がゼロの場合を適切に処理します。引数:
score: 正規化するスコア (np.ndarray)。
戻り値: 正規化されたスコア (
np.ndarray)。
safe_score_for_plot
観測済みの点のスコアを NaN に設定し、プロットに適した形に調整します。
目的: プロット時に観測済みの点にAcquisitionスコアが表示されないように、それらの点のスコアを
NaNに設定します。引数:
score: Acquisitionスコア (np.ndarray)。observed_mask: 観測済みであるかを示すブールマスク (np.ndarray)。
戻り値: 観測済み点のスコアが
NaNに設定されたスコア (np.ndarray)。
compute_plot_posterior_and_score
プロット用にGPの予測平均、標準偏差、Acquisitionスコアを計算します。
目的: 現在の観測データに基づいて、Bayesian Optimizationモデルから予測平均、標準偏差、そしてAcquisitionスコアを計算します。これらの値はアニメーションのプロットに使用されます。
引数:
X_candidates: 候補点の入力データ (np.ndarray)。y_all: 全候補点に対する観測値。未観測の点はnp.nan(np.ndarray)。args:argparse.Namespaceオブジェクト。
戻り値: 予測平均、予測標準偏差、Acquisitionスコアのタプル (
tuple[np.ndarray, np.ndarray, np.ndarray])。Acquisitionスコアの計算でエラーが発生した場合は、全ての値がNaNの配列が返されます。
run
メインのシミュレーションとアニメーション生成ロジックです。
目的: シミュレーションの初期設定、
matplotlibを用いたプロット要素の描画、FuncAnimationを使ったアニメーションの生成、そしてその保存または表示を行います。引数:
args:argparse.Namespaceオブジェクト。コマンドライン引数で指定された設定を保持します。
戻り値: なし。
main
スクリプトのエントリポイントです。
目的: コマンドラインパーサーを構築し、引数を解析・正規化した後、
run()関数を呼び出してメインの処理を実行します。エラーが発生した場合はトレースバックを出力し、例外を再発生させます。引数: なし。
戻り値: なし。
4. コマンドライン引数
引数名 |
型 |
デフォルト値 |
説明 |
|---|---|---|---|
|
|
|
(位置引数) シミュレーションモードを指定します(後方互換性のため)。 |
|
|
|
(位置引数) 最大イテレーション数を指定します(後方互換性のため)。 |
|
|
|
(位置引数) アニメーションの出力ファイル名を指定します(後方互換性のため)。 |
|
|
|
シミュレーションモード。選択肢: |
|
|
|
Bayesian Optimizationに使用するモデル。選択肢: |
|
|
|
|
|
|
|
Acquisition関数を明示的に上書きします。空の場合、 |
|
|
|
最大評価点数 (イテレーション数)。 |
|
|
|
アニメーションを保存するファイル名。空の場合、自動生成されます。 |
|
|
|
候補点のグリッド数。 |
|
|
|
観測ノイズの標準偏差。 |
|
|
|
乱数シード。 |
|
|
|
UCB/LCB Acquisition関数のパラメータ。 |
|
|
|
ガウス過程カーネルの長さスケール。 |
|
|
|
ガウス過程ハイパーパラメータ最適化のリスタート回数。 |
|
|
|
|
|
|
|
|
|
|
|
アニメーションをGIFファイルとして保存するかどうか。選択肢: |
|
|
|
アニメーションをウィンドウに表示するかどうか。選択肢: |
|
|
|
最大化問題としてBayesian Optimizationを実行するかどうか。選択肢: |
|
|
|
下部パネルにAcquisitionスコアのプロットを表示するかどうか。選択肢: |
|
|
|
上部パネルで候補点をAcquisitionスコアに基づいて色付けするかどうか。選択肢: |
|
|
|
GIF保存時のフレームレート (Frames Per Second)。 |
5. 入出力
入力
コマンドライン引数:
スクリプトの動作を制御する様々なパラメータ(シミュレーションモード、モデル、イテレーション数、保存オプションなど)は、上記の「コマンドライン引数」セクションで詳述されています。
出力
標準出力 (
stdout):スクリプトの実行開始時に、設定されたパラメータ(モード、モデル、Acquisition関数、イテレーション数など)が列挙されます。
各シミュレーションステップ(イテレーション)の進行状況(ステップ番号、選択されたインデックス、
xの値、yの値)が出力されます。
グラフィカル出力:
アニメーションウィンドウ:
--show 1オプションが指定された場合、matplotlibのウィンドウが開かれ、Bayesian Optimizationの進行状況がリアルタイムでアニメーションとして表示されます。表示される内容には、真の関数、GPの予測平均と95%信頼区間、観測されたデータ点、次の評価点、および(
--show-score 1の場合)Acquisitionスコアのプロットが含まれます。--score-color 1の場合、上部パネルのx軸の下部に、候補点がAcquisitionスコアに応じて色付けされて表示されます。
GIFファイル:
--save 1オプションが指定された場合、生成されたアニメーションはGIFファイルとして保存されます。出力ファイル名は
--outfileオプションで指定できます。指定がない場合、デフォルトでgp_animation_{mode}_{effective_model}_{nmaxiter}.gifという形式でファイルが生成されます。保存後、保存先のファイルパスが標準出力に表示されます。