scipyでFittingするためのテンプレート


概要

たまに簡単なFittingをする時があるのですが、たまになのでよくやり方を忘れます。なので忘れないためにここに書いちゃおうという流れになります。
今回はScipy.optimizeのCurve_Fitを使用します。

from scipy.optimize import curve_fit
import numpy as np

1次関数のFit

1次関数で最適化しようと思っている仮データを作ります。

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 4, 3, 5, 4, 7, 6, 9, 10, 13, 10 ]
x, y = np.array(x), np.array(y)

関数を定義し、Fittingするだけです。

def fit_linear(x, a, b):
    return a*x + b
popt, pcov = curve_fit(fit_linear, x, y)

popt[0]にaが、popt[1]にbが入っています。pcovは共分散です。

この場合はpopt = [1.01818182, 1.45454545]となりました。
もし元データと比較したい場合は...matplotlib.pyplot as pltをインポートしている前提で...

plt.scatter(x, y)
plt.plot(x, popt[0]*x + popt[1])

としてあげればOKでしょう。

指数関数を使ったFit

これも基本は同じなのですが...

なにかしら原点を通っていて、2次関数では表せないようなグラフがあり、
y = exp(a*x)-1
でFittingするとします。

def fit_func(x, a):
    return np.exp(a*x)-1
popt, pcov = curve_fit(fit_func, x, y)
plt.scatter(x, y)
plt.plot(x, np.exp(param[0]*x)-1)

まあほとんど同じです。

とりあえず簡易的に最適化したい時はこれでなんとかしましょう。