7

を使用してscipy.optimize.curve_fitいますが、全体的な最小値ではなく局所的な最小値に収束していると思われます。

次の方法でシミュレートされたアニーリングを使用してみました。

def fit(params):
 return np.sum((ydata - specf(xdata,*params))**2)

p = scipy.optimize.anneal(fit,[1000,1E-10])

specf私が当てはめようとしている曲線はどこにありますか。ただし、戻り値が全体的な最小値に達したことを示している場合でも、の結果pは によって返される最小値よりも明らかに悪いです( anneal を参照)。curve_fit

どうすれば結果を改善できますか? SciPy にグローバル カーブ フィッターはありますか?

4

3 に答える 3

7

そうです、Levenburg-Marquardt アルゴリズムを使用しているため、(収束するとき) 局所的最小値に向かってのみ収束します。SciPy にはグローバル カーブ フィッターはありません。既存のグローバル オプティマイザーを使用して独自に作成する必要があります。ただし、これでも必要な値に収束する必要はないことに注意してください。それはほとんどの場合不可能です。

結果を改善する唯一の方法は、開始パラメータを十分に推測することです。

于 2011-03-22T06:28:41.347 に答える
3

leastsq() (curve_fit は実際にこれを使用しますが、完全な出力は得られません) または、curve_fitの代わりにODR パッケージを使用してみてください。

leastsq() の完全な出力は、カイ 2 乗値など、より多くの情報を提供します (これを迅速で汚れた適合度テストとして使用する場合)。

フィットに重みを付ける必要がある場合は、次の方法で行うことができます。

fitfunc = lambda p,x: p[0]+ p[1]*exp(-x)
errfunc = lambda p, x, y, xerr: (y-fitfunc(p,x))/xerr
out = leastsq(errfunc, pinit, args=(x,y, xerr), full_output=1)
chisq=sum(infodict['fvec']*infodict['fvec'])
于 2011-03-22T19:25:55.070 に答える
1

これは重要な問題です。進化戦略の使用を検討したことがありますか? 私は ecspy で大きな成功を収めました ( http://code.google.com/p/ecspy/を参照)。コミュニティは小さいですが、非常に役に立ちます。

于 2011-04-13T13:57:57.817 に答える