scipy.optimize.fmin_bfgs:「精度の低下により、必ずしも必要なエラーが達成されるとは限らない」


8

Pythonでscipy.optimize.fmin_bfgs関数を使用して関数を最適化しようとすると、投稿の件名に警告が表示されます。完全な出力:

警告:精度の低下により、必ずしも望ましいエラーが達成されるとは限りません

     Current function value: nan
     Iterations: 1
     Function evaluations: 18
     Gradient evaluations: 3

致命的なエラーではありません。答えは出ますが、最適な検索結果にはほど遠いです。

このエラーを生成する可能性のある一般的な「noob」エラーはありますか?私は昨日だけこのパッケージを使い始めました。だから、どこから始めればいいのかさえわからない。どんな助けでもありがたいです!

回答:


9

このような状況では、ソースコードを確認すると役立ちます。のすべてscipyがオープンソースであるため、これは簡単です!

ソースコードを読むとわかるように、警告メッセージが表示されwarnflag==2ます。これは、linesearch関数がNoneを返す(失敗する)ときに、コードの他の場所で設定されます。

では、なぜラインサーチは失敗するのでしょうか?最適化アルゴリズムの目的は、一連の反復により目的関数の最小値を見つけることです。この場合、ラインサーチは、BFGSの近似がまだ有効であるステップサイズを見つけようとします。関数のヘッセ行列またはその勾配が何らかの方法で不適切に動作している場合、勾配が非ゼロであっても、括弧で囲まれたステップサイズがゼロとして計算される可能性があります。

私の提案は、文献(NocedalとWrightが行検索とBFGSメソッドについて十分に議論しています)または関数に移動して、検索している領域で正常に動作していることを確認することです。


ありがとう、私はすでにソースコードをチェックアウトしていました。悲しいかな、問題はBFGSの理論的知識の欠如です:-)ベクトル化されていない実装でBFGSをうまく使用できたので、マトリックスが期待どおりに動作していないと思います。それは問題を見つけるための方向かもしれません。
ACEG 2012

最小化しようとしている実際の機能と検索している領域を述べると、続行方法についての手がかりが得られる場合があります。
Aron Ahmadia 2012

1
その間、私は問題を解決しました。エラーは(よくあることですが)問題のある結果とはまったく関係がありませんでした。私の直感は正しかった、私は行列が転置された行列を期待したところに行列を渡していた。現在も最初の警告が表示されますが、繰り返し回数が多く、適切な値が得られます。
ACEG 2012

リンクが腐っている...リンクを更新し、回答自体に関連するビットを含める
innisfree

腐ったリンクを修正しました。
Aron Ahmadia 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.