2

これは私のコードです (より大きなコードの例です):

from scipy.optimize import curve_fit

def func(x, a, b):
   return a + b*x

xlist = [10, 30, 50, 70, 90, 110, 130, 150, 170, 190, 210, 230]
ylist = [0.0074999999999999997, 0.011875, 0.0057812499999999999, 0.0036458333333333334, 0.0020312500000000001, 0.0013125000000000001, 0.00098958333333333342, 0.00089285714285714283, 0.00074218750000000001, 0.00093749999999999997, 0.00071874999999999999, 0.00088068181818181821]

popt, pcov = curve_fit(func, xlist, ylist)

print(popt[0], popt[1])

ご覧のとおり、非常に単純なa + b*x関数で非常に単純な適合を試みています。問題は、これが値を返すことです:

(-119.99689110581872, 1.0)

fora=popt[0]およびb=popt[1]zunzun.com との同じ適合により、より妥当な値が得られます。

a = 7.8372289537296004E-03
b = -3.9402329475524466E-05

まったく同じ機能のために。

ここで何が間違っていますか?


編集

以下のウォーレンは、これはバグである可能性があると述べました。そのように報告する必要がありますか、それともこれは予想される動作ですか?

4

2 に答える 2

3

値をxlistnumpy 配列に変更すると機能します。

In [38]: popt, pcov = curve_fit(func, array(xlist, dtype=float), ylist)

In [39]: popt
Out[39]: array([  7.83722896e-03,  -3.94023294e-05])

最初はこれはバグのように見えますが、根本的なコードが引数を受け取り、それを変更せずに関数にxdata渡しているのです。あなたの例では、これは式で、Pythonリストであることを意味します。 つまり、必要な計算を行っていないということです。a + b*xxb*x

したがって、仕事の定義を作成するにfuncは、引数xdataは numpy 配列でなければなりません。または、次のように定義することもできますfunc

def func(x, a, b):
    return a + b*np.asarray(x)
于 2013-06-04T23:47:05.950 に答える
2

私の記憶が正しければ、scipy のカーブ フィッティング ルーチンのデフォルトの初期パラメータはすべて 1.0 です。これは直線などの単純なケースではうまく機能しますが、エラー スペースは直線カーブ フィッティングの方が単純であるため、エラー スペースが「でこぼこで不均一」な場所に合わせようとすると、自分の結果と zunzun の結果に違いが見られる可能性があります。 .com。

最適な解が存在する正しい値 (または値の範囲) について何らかの考えがある場合、そのような値で scipy ルーチンを開始すると、ほとんどの場合、すべての値から開始するよりも良い結果が得られます。

zunzun.com では、初期パラメータの「推定値」または推測値を入力できますが、遺伝的アルゴリズムを使用して初期パラメータ推定値を決定するため、これらは Web サイトでは必要ありません。zunzun.com Web サイトの BSD ライセンスの Python フィッティング ソース コードは、次の場所にあります。

http://code.google.com/p/pyeq2/

非常に幅広い例が付属しています。コードへのリンクについては、zunzun.com Web ページの下部も参照してください。ご不明な点がございましたら、お気軽にお問い合わせください。喜んでお手伝いさせていただきます。

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

于 2013-06-05T13:47:35.077 に答える