2

勾配がわかっている関数を最小化することを含む最適化問題がありますが、任意の時点での目的関数の実際の値は不明です。

BFGSを使用して関数を最適化したいのですが、私が見つけたすべてのBFGS実装では、特にライン探索ステップで、目的の値に関する知識が必要なようです。BFGSのPython(scipy)とC++の両方の実装を見てきました。

もちろん、最急降下法を使用することもできますが、ここで車輪の再発明をしたくありません。

何か案は?

もう少し詳しく: hを最小化したい。しかし、私はhを与えられていません。私が与えられているのはh=f(g)であり、 g(x)の明示的な式です。fは基本的に、gの勾配を、計算するのはそれほど難しくはありませんが、統合することは不可能な、一種のトリッキーな幾何学的な方法で変換します。したがって、 h(x)の勾配を計算するのは非常に簡単ですが、 h( x )の明示的な値を取得するのは困難です。

4

4 に答える 4

3

あなたは問題を根を見つけることの問題に減らしたと思います。scipyでルートファインダーの1つを使用することができます。次に、そのポイントが最小、最大、または変曲点であるかどうかを確認する必要があります。

于 2013-02-01T16:51:04.973 に答える
2

その場合は、h(x)を2乗に最小化してみてください。これは、基本的にh(x)がゼロに近い点を検索しているためです。二乗してパラメータ検索を実行することで、凸状にすることができます。

編集:申し訳ありませんが、私が意味したのはh(x)が勾配です..

于 2013-02-01T04:22:38.030 に答える
1

これについて少し時間をかけて考えた結果、BFGSのような準ニュートン法を採用することが答えだと思います。関数値がBFGS計算に入る唯一の場所は、最初のWolfe条件であるライン探索セクションです。

解決策は、代わりに最初のWolfe条件(Armijoルール)をチェックしないライン探索法を使用することだと思います。

PythonとC++でBFGSに実装しました:https ://gist.github.com/rmcgibbo/4735287 。ただし、2番目に、BFGSルーチンに常に減少する関数を提供することで、同じ結果が得られると思います(たとえば、呼び出された回数を追跡するカウンターが含まれ、常にそれよりも小さい数を返します。最後に電話したとき)。減少は、常にArmijoルール(http://en.wikipedia.org/wiki/Wolfe_conditions)に合格するのに十分な大きさである必要があります。

于 2013-02-08T00:06:26.473 に答える
0

たぶん、もっと簡単な例について話すことが役立つでしょう。スカラーy=f(x)を取ります。yの勾配はdf/dxです。どこでも導関数を知っている場合は、f(x)の値を分析的または数値積分によって簡単に(!!)決定できますが、グローバル定数は決定できません。古い「積分(f(x)dx)= F(x)+C」トリック。hしたがって、少なくとも1つのポイントで関数を固定できない限り、問題を解決することはできません。min)のxような最小値の位置を追跡できますが、の値は追跡できません。h(x)h(x)

于 2013-02-01T12:48:54.227 に答える