はじめに
lmfitは非線形最小二乗法を用いてカーブフィットするためのライブラリであり、Scipy.optimize.curve_fitの拡張版に位置する。ここでは、2次元ガウス関数モデルで2次元データをカーブフィッティングする方法について説明する。
コード

解説
モジュールのインポートなど
バージョン
2dガウス関数の定義
x,yに相関のないガウス関数を定義する。
データの生成
x, y は np.meshgridで2次元化し、gaussian2Dによりデータを作成する。np.random.normal(scale=.1,size=x.shape)でノイズを加えた。
図示すると以下のようになる。

残差を返す関数の定義
初期値の設定
カーブフィット
最初にMinimizer
オブジェクトを作成する。残差の関数と初期パラメータ、残差の関数に渡す引数をfcn_argsで設定する。
fit.leastsq()により、Levenberg-Marquardt最小化を使用して近似を実行する。
フィッティング後のパラメータの値は以下のようになる。
フィッティング結果の表示
ベストフィットデータはdata.flatten() – out.residualで得ることができる。out.residualが1次元データのため、1次元でベストフィットデータを得て、reshapeでもとの形状に戻す。
左が元データ、右がベストフィットデータとなる。カラーバーはinset_axesによりねじ込むことで表示した。inset_axesについては下記記事で解説している。

[matplotlib] 79. inset_axesでカラーバーを自由自在に配置する
matplotlibのplt.imshowで表示した画像のカラーバーを任意の位置に表示する方法について説明する。mpl_toolkits.axes_grid1.inset_locator の inset_axesを用いて表示する。

ベストフィットデータを得る別の方法
out.params[‘height’]のようにすることでもベストフィットパラメータを得られるので、それを関数に流し込むことでもベストフィットデータが作成可能となる。

参考
Non-Linear Least-Squares Minimization and Curve-Fitting for Python — Non-Linear Least-Squares Minimization and Curve-Fitting for Python
Attention Required! | Cloudflare
コメント