2

いくつかのデータに対する指数関数の 2 つの形式の最適な適合を計算しようとしていx, yます (データ ファイルはここからダウンロードできます) 。

コードは次のとおりです。

from scipy.optimize import curve_fit
import numpy as np

# Get x,y data
data = np.loadtxt('data.txt', unpack=True)
xdata, ydata = data[0], data[1]

# Define first exponential function
def func(x, a, b, c):
    return a * np.exp(b * x) + c

# Get parameters estimate
popt, pcov = curve_fit(func, xdata, ydata)

print popt

# Define second exponential function (one more parameter)
def func2(x, a, b, c, d):
    return a * np.exp(b * x + c) + d

# Get parameters estimate
popt2, pcov2 = curve_fit(func2, xdata, ydata)

print popt2

最初の指数関数は、zunzun.com ( PDF はこちら) とまったく同じ値を示しpoptます。

[  7.67760545e-15   1.52175476e+00   2.15705939e-02]

しかし、2 番目の値は に対して明らかに間違っていpopt2ます。

[ -1.26136676e+02  -8.13233297e-01  -6.66772692e+01   3.63133641e-02]

これは、同じ 2 番目の関数に対するzunzun.com の値 ( PDF はこちら) です。

a = 6.2426224704624871E-15
b = 1.5217697532005228E+00
c = 2.0660424037614489E-01
d = 2.1570805929514186E-02

ここで推奨されているようにリスト配列を作成しようとしましたpython's (scipy) カーブフィッティングで奇妙な結果ですが、それは役に立ちませんでした。ここで何が間違っていますか?


1を追加

問題は、関数に供給している初期値の欠如に関係していると推測しています(ここで説明されているように:ガウスフィット with scipy.optimize.curve_fit in python with wrong results )

最初の指数関数から 2 番目の指数関数に推定値を与えると (新しいパラメーターdを最初はゼロにする):

popt2, pcov2 = curve_fit(func2, xdata, ydata, p0 = [popt[0], popt[1], popt[2], 0]) 

zunzun.com と比較すると、非常に合理的な結果が得られますが、それでも間違っています。

[  1.22560853e-14   1.52176160e+00  -4.67859961e-01   2.15706930e-02]

では、質問は次のように変わります: 2 番目の関数により適切なパラメーターを自動的に与えるにはどうすればよいでしょうか?

4

2 に答える 2

3

Zunzun.com は、差分進化遺伝的アルゴリズム (DE) を使用して初期パラメーター推定値を見つけ、それを scipy のレーベンバーグ-マルカート ソルバーに渡します。DE は、実際にはグローバル オプティマイザ自体として使用されるのではなく、「初期パラメータ ゲッサー」として使用されます。

どのサイトの Web ページの下部にも、zunzun.com フィッターの BSD ライセンスの Python ソース コードへのリンクがあります。包括的な例が多数掲載されているため、すぐに自分でコーディングする必要はありません。ご不明な点がございましたら、お気軽にお問い合わせください。できる限りお手伝いさせていただきます。

ジェームス・フィリップス zunzun@zunzun.com

于 2013-07-09T14:12:07.530 に答える