Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【matplotlib】でヒストグラム+フィッティングのメモ + ガウス分布でフィット

(2018/07/25 過去記事)

フィッティング関連

pythonでのfittingには scipy.optimize.curve_fit を用いる

■ 参考 : SciPyフィッティング (fitting)


■ 参考 : 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)

最後のプロットで、元データとフィットしたあとの関数を重ね書きできる


ランキング参加中です

↓クリックしていただけると嬉しいです〜