(ドキュメントcurve_fit
)の機能が使えると思います。使用法の基本的な例:scipy.optimize
import numpy as np
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a*x**2 + b*x + c
x = np.linspace(0,4,50)
y = func(x, 5, 3, 4)
yn = y + 0.2*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x, yn)
ドキュメントに続いて、pcovは次のようになります。
poptの推定共分散。対角線は、パラメーター推定値の分散を提供します。
したがって、このようにして、係数の誤差推定を計算できます。標準偏差を得るには、分散の平方根を取ることができます。
これで係数にエラーが発生しましたが、これはydataと近似の間の偏差にのみ基づいています。ydata自体のエラーも考慮したい場合は、curve_fit
関数は次のsigma
引数を提供します。
シグマ:なしまたはN長シーケンス
Noneでない場合は、ydataの標準偏差を表します。このベクトルが与えられた場合、最小二乗問題の重みとして使用されます。
完全な例:
import numpy as np
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a*x**2 + b*x + c
x = np.linspace(0,4,20)
y = func(x, 5, 3, 4)
# generate noisy ydata
yn = y + 0.2 * y * np.random.normal(size=len(x))
# generate error on ydata
y_sigma = 0.2 * y * np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x, yn, sigma = y_sigma)
# plot
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.errorbar(x, yn, yerr = y_sigma, fmt = 'o')
ax.plot(x, np.polyval(popt, x), '-')
ax.text(0.5, 100, r"a = {0:.3f} +/- {1:.3f}".format(popt[0], pcov[0,0]**0.5))
ax.text(0.5, 90, r"b = {0:.3f} +/- {1:.3f}".format(popt[1], pcov[1,1]**0.5))
ax.text(0.5, 80, r"c = {0:.3f} +/- {1:.3f}".format(popt[2], pcov[2,2]**0.5))
ax.grid()
plt.show()

次に、numpy配列の使用について別のことを説明します。numpyを使用する主な利点の1つは、配列に対する操作が要素ごとに適用されるため、forループを回避できることです。したがって、例のforループは次のように実行することもできます。
trendx = arange(datasetx[0], (datasetx[-1]+1))
trendy = trend[0]*trendx**2 + trend[1]*trendx + trend[2]
arange
リストの代わりにnumpy配列を返すため、範囲の代わりに使用します。この場合、numpy関数を使用することもできますpolyval
:
trendy = polyval(trend, trendx)