(2018/07/25 過去記事)
フィッティング関連
pythonでのfittingには scipy.optimize.curve_fit を用いる
■ 参考 : scipy.optimize.curve_fit
によると、フィッティングの結果、共分散行列が得られる
この行列の対角成分はそれぞれのパラメーターの分散、標準偏差を表す
サンプルコード
popt, pcov = curve_fit(func, xdata, ydata) popt array([ 2.55423706, 1.35190947, 0.47450618]) plt.plot(xdata, func(xdata, *popt), 'r-', ... label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt)) perr = np.sqrt(np.diag(pcov))
とすると、perrという配列にパラメーターの標準偏差が入っている
(追記)
ガウス分布でフィットしてみたので、そのメモ
インポートと、関数の定義
funcはただのガウス分布
func2は、ガウス分布に上限値を与えた特殊な関数・・・(今回はこれでフィットしたのでメモ)
import matplotlib.pyplot as plt from scipy.optimize import curve_fit def func(x, a, b, c, d): y = a * np.exp(-b * (x-c)*(x-c)) + d return y def func2(x, a, b, c, d): y = a * np.exp(-b * (x-c)*(x-c)) + d y = np.clip(y, None, 255) return y
フィットするデータはxdataとydata
ydataがすでにあるとして、それに対応するxdataがないので、インデックスをxdataにする
初期値はp0で与える
パラメーターの上限値とか現地はboundsで与える、書き方が特殊なので注意
xdata = [i for i in range(len(ydata))] #初期値 p0 = [500, 0.05, 1000, 0] bounds=([0, -10, 0, -1e+4], [1e+4, 10, 1e+4, 1e+4]) # パラメーターの下限値と上限値 popt, pcov = curve_fit(func, xdata, ydata, p0=p0, bounds=bounds) print(popt) fig = plt.figure(figsize=[10, 5]) plt.plot(xdata, ydata, c="black", linewidth=2) plt.plot(xdata, func(xdata, *popt), c="magenta", linewidth=3)
最後のプロットで、元データとフィットしたあとの関数を重ね書きできる
ランキング参加中です
↓クリックしていただけると嬉しいです〜