[lmfit] 6. 2次元ガウス関数によるフィッティング

lmfit

はじめに

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

コード

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

解説

モジュールのインポートなど

バージョン

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
2D Gaussian fit using lmfit
I need to fit a two dimensional Gaussian to a data set I read in. My choice of fitting routine is lmfit, as it allows easy implementation of boundary conditions...

コメント