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、ので、これらのパラメータとその目的関数であることに注意してください値が返されているはずです。誰もがこれを経験する?アイデア?
申し訳ありませんが、私はそれを置くことを怠りました。私はJ = 1.33e + 08でフィットを受け取り、代わりにそれらのパラメータを返すことを期待しました。私はこれを言うために投稿を編集しました。 – AstroBen
これは、ソリューションが境界/制約を満たしていない状況や、関数が呼び出されて勾配を推定している状況で主に見てきました。しかしどちらもあなたの場合には適用されないようです。 – kazemakase
今のところ、目的関数の最良の値のためのパラメータを常に保存する単純なif-thenステートメントがあります。目的関数の最後に戻ります。まだ、かなり迷惑な;私はそれをバグとみなして、scipyの人々と一緒に旗竿を走らせるべきかどうか疑問に思っています。 – AstroBen