2017-12-05 6 views
1

scipyを使ったNewton-CG最小化関数の不思議な振る舞い:目的関数計算を呼び出すたびに、私は値を印刷します。私はしばしば、ミニマイザーが最終的に報告を終えるよりも低い値を見つけることがわかります。出力の例を以下に示します。 "Iter"は最小化関数からの反復数であり、 "call"は最小化子が目的関数 "J"の計算を呼び出した時間である。 「dJ」はJが前の呼び出しからどのくらい変更されたかです。 「f」は「iternumは、」コールバック関数を含め、すべての計算を含むオブジェクトのクラスである:scipy.optimize.minimize( 'Newton-CG')は、常に最も低い目的関数を返しません

res=scipy.optimize.minimize(f.J,f.z,args=(F),tol=1.e-4,method='Newton-CG', \ 
jac=f.Jacobian,hessp=f.Hessian, callback=f.iternum) 

Iter 1 , call 30 J=3.73e+09 dJ=3.58e+09 
Iter 1 , call 31 J=1.78e+09 dJ=-1.95e+09 
Iter 1 , call 32 J=5.23e+08 dJ=-1.26e+09 
Iter 1 , call 33 J=1.76e+08 dJ=-3.47e+08 
Iter 1 , call 34 J=1.33e+08 dJ=-4.29e+07 
Iter 1 , call 35 J=1.44e+08 dJ=1.14e+07 
Iter 2 , call 36 J=1.42e+08 dJ=-1.85e+06 
Iter 2 , call 37 J=1.42e+08 dJ=5.19e+04 

res.fun = 1.42e+08 

ただし、最低のJ値は、実際に1.33e + 08、ので、これらのパラメータとその目的関数であることに注意してください値が返されているはずです。誰もがこれを経験する?アイデア?

+0

申し訳ありませんが、私はそれを置くことを怠りました。私はJ = 1.33e + 08でフィットを受け取り、代わりにそれらのパラメータを返すことを期待しました。私はこれを言うために投稿を編集しました。 – AstroBen

+1

これは、ソリューションが境界/制約を満たしていない状況や、関数が呼び出されて勾配を推定している状況で主に見てきました。しかしどちらもあなたの場合には適用されないようです。 – kazemakase

+0

今のところ、目的関数の最良の値のためのパラメータを常に保存する単純なif-thenステートメントがあります。目的関数の最後に戻ります。まだ、かなり迷惑な;私はそれをバグとみなして、scipyの人々と一緒に旗竿を走らせるべきかどうか疑問に思っています。 – AstroBen

答えて

-1

実際にはJ値は1.33e + 08であるため、これらのパラメータと目的関数値が返されているはずです。

No. Jの最小値は1.33e + 08ではなく、その値に対応するパラメータは数学的に有意ではありません。これは返されるべき値ではありません。コールバック関数を介してログに記録しても、幸福にはならない。

Newton-CGのようなグラジエントベースの最小化プロセスは、関数のローカル最小値を見つけると停止します。ローカルミニマムがグローバルであるという約束はありません。ローカルミニマムへの道のりでは、探索が停止する最小値よりも低い値の関数を通過する可能性は全くあります。機能はその時点で終了条件を満たしていないため、ポイントがローカル最小値ではないと判断されたため、検索が続けられました。そのような値を返すことは、「ちょっと、私が見つけたランダム関数値は小さくて見える」ということであり、その時点で関数が局所的に最小化されているという証拠は一切ありません。これは、最適化手法が意図したものではありません。

表示される主観的に小さな値をランダムに取得する代わりに、検索でグローバルな最小値が見つからない理由を考慮する必要があります。多分、変数がひどくスケールされているかもしれません。多分最初の点はあまり良くありません。たぶんそこには多くのローカルミニマムがあり、それらの間でジャンプして選択するbasinhoppingメソッドを試す必要があります。

関連する問題