2016-10-04 31 views
0

現在、最小化の問題を数値的に解決しようとしており、SciPyで利用可能な最適化ライブラリを使用しようとしました。SciPy fmin_bfgs精度損失を扱う

My機能および誘導体はどちらか、動作しないうち最小化ここに提示することには少しあまりにも複雑であるが、それらは以下の機能に基づいています:

def func(x): 
    return np.log(1 + np.abs(x)) 
def grad(x): 
    return np.sign(x)/(1.0 + np.abs(x)) 

fmin_bfgs関数を呼び出すときに(と降下方法をx = 10に初期化すると、次のメッセージが表示されます。

Warning: Desired error not necessarily achieved due to precision loss. 
    Current function value: 2.397895 
    Iterations: 0 
    Function evaluations: 24 
    Gradient evaluations: 22 

出力は10(つまり初期点)です。

  • 目的関数は凸ではない:私は他の非凸関数で確認し、この方法は私に正しい結果を与えたが、私はこのエラーは二つの問題によって引き起こされる可能性があるとします。

  • 目的関数は、ログのために最小値から遠く離れていると「非常にフラット」です。

私の仮定は正しいですか?あるいは、問題は他の何かから来ていますか? エラーが何であっても、これを修正するには何ができますか?特に、他に利用可能な最小化メソッドがありますか?

ありがとうございます。

+0

「np.abs(x)」を[ここ](http://math.stackexchange.com/questions/728094/approximate-x-with-a-smooth-news)で議論されているような微分可能な近似で置き換えることができます。関数)。例えば、 'func'が' np.log(1 + np.sqrt(x ** 2 + 10 ** - 10)) 'を返すとき、最適化は問題ありません。 – Stelios

+0

確かに!このアドバイスをありがとうございます!私はいくつかの検証を行いましたが、誤差は0の絶対値の非導出性から来ているようです。 – PAM

答えて

1

abs(x)は、微分不可能であるため、常にやや危険です。ほとんどのソルバーは問題が円滑になることを期待しています。目的の関数からlogを落としてからを落とすことができるので、abs(x)を最小化したままにしておきます。多くの場合、これは次のようにしてよりよく行うことができます。もちろん

代わりmin abs(x)使用の

min t 
-t <= x <= t 

これは、(直線的)解決することができるソルバーを必要とNLPSを制約。

+0

残念ながら絶対値を扱う以外は選択肢がありません。また、私は実際の目的関数にあなたの単純化を適用することはできません。私が質問で与えた機能は、実際の機能を提供せずに私の問題を再現可能にするための一例にすぎません。 – PAM

関連する問題