scipy.optimize.leastsqの最も簡単なレシピ

目的

呪文を唱えて訳も分からず結果をだそう()

公式ドキュメント

http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html

最小二乗法の原理

数学的には、以下の2項目を読めば大体分かると思われます。

最小二乗法 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95

ヤコビ行列 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%A4%E3%82%B3%E3%83%93%E8%A1%8C%E5%88%97

計算による誤差や発散についてはここでは書きません。グラフをプロットしてあーだいたい合ってるなぁで済ませられる心が広い人になってください。

leastsqの最小の使い方

# フィッティングのモデル関数
fitfunc = lambda p, x: p[0] * pylab.sin(2 * pylab.pi/180. * x + p[1]) ** 2
errfunc = lambda p, x, y: fitfunc(p, x) - y # 実際のデータyとモデル関数との差を返す関数
p0 = [0, 0] # 係数の初期値を入れておく。
res = leastsq(errfunc, p0[:], args = (x, y))[0] # pの推定値が得られる。ハッピー?

gistに上げたった。
https://gist.github.com/akira093/5069813

こんなのが得られる。

f:id:virsalus:20130302061254p:plain