Nelder-Mead 法 minsearch

minsearchNelder-Mead 法 (a.k.a. downhill simplex 法) によって最適化を行います。 Nelder-Mead 法では、 パラメータ空間の次元を \(D\) として、 \(D+1\) 個の座標点の組を、各点での目的関数の値に応じて系統的に動かすことで最適解を探索します。

重要なハイパーパラメータとして、座標の初期値があります。 局所最適解にトラップされるという問題があるので、初期値を変えた計算を何回か繰り返して結果を確認することをおすすめします。

ODAT-SEは、SciPy の scipy.optimize.minimize(method="Nelder-Mead") 関数を用いています。 詳しくは 公式ドキュメント をご参照ください。

前準備

あらかじめ scipy をインストールしておく必要があります。

python3 -m pip install scipy

入力パラメータ

サブセクション paramminimize を持ちます。

[param] セクション

  • initial_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: パラメータの初期値。 定義しなかった場合は一様ランダムに初期化されます。

  • unit_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: 各パラメータの単位。

    探索アルゴリズム中では、各パラメータをそれぞれこれらの値で割ることで、 簡易的な無次元化・正規化を行います。 定義しなかった場合にはすべての次元で 1.0 となります。

  • min_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: パラメータが取りうる最小値。

    最適化中にこの値を下回るパラメータが出現した場合、 ソルバーは評価されずに、値が無限大だとみなされます。

  • max_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: パラメータが取りうる最大値。

    最適化中にこの値を上回るパラメータが出現した場合、 ソルバーは評価されずに、値が無限大だとみなされます。

[minimize] セクション

Nelder-Mead 法のハイパーパラメータを設定します。 詳細は scipy.optimize.minimize のドキュメントを参照してください。

  • initial_scale_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: Nelder-Mead 法の初期 simplex を作るために、初期値からずらす差分。 initial_list と、 initial_listinitial_scale_list の成分ひとつを足してできるdimension 個の点を 合わせたものが initial_simplex として使われます。 定義しなかった場合、各次元に 0.25 が設定されます。

  • xatol

    形式: 実数型 (default: 1e-4)

    説明: Nelder-Mead 法の収束判定に使うパラメータ

  • fatol

    形式: 実数型 (default: 1e-4)

    説明: Nelder-Mead 法の収束判定に使うパラメータ

  • maxiter

    形式: 整数 (default: 10000)

    説明: Nelder-Mead 法の反復回数の最大値

  • maxfev

    形式: 整数 (default: 100000)

    説明: 目的関数を評価する回数の最大値

出力ファイル

SimplexData.txt

最小値を求める途中経過に関する情報を出力します。 1行目はヘッダー、2行目以降にstep、入力ファイルの [solver.param] セクションにある string_list で定義された変数の値、最後に関数の値が出力されます。

以下、出力例です。

#step z1 z2 z3 R-factor
0 5.25 4.25 3.5 0.015199251773721183
1 5.25 4.25 3.5 0.015199251773721183
2 5.229166666666666 4.3125 3.645833333333333 0.013702918021532375
3 5.225694444444445 4.40625 3.5451388888888884 0.012635279378225261
4 5.179976851851851 4.348958333333334 3.5943287037037033 0.006001660077530159
5 5.179976851851851 4.348958333333334 3.5943287037037033 0.006001660077530159

res.txt

最終的に得られた目的関数の値とその時のパラメータの値を記載しています。 最初に目的関数、その後は入力ファイルの [solver.param] セクションにある string_list で定義された変数の値が順に記載されます。

以下、出力例です。

fx = 7.382680568652868e-06
z1 = 5.230524973874179
z2 = 4.370622919269477
z3 = 3.5961444501081647

リスタート

Nelder-Mead法による最適値探索はリスタートに対応していません。