はじめに
lmfitは非線形最小二乗法を用いてカーブフィットするためのライブラリであり、Scipy.optimize.curve_fitの拡張版に位置する。ここでは、ガウス関数の混合モデルでパラメータ設定の際にprefixを使い、簡便にカーブフィッティングする方法について説明する。
コード
解説
モジュールのインポートなど
バージョン
ガウス分布データの生成
3つのガウス関数が重なったデータを作成する。np.random.normal()
によりデータにばらつきを付与した。
図示すると以下のようになる。
パラメータの設定
1つ目
modelを定義する際、GaussianModel(prefix=’g1_’)のようにprefixを設定するとパラメータ名の先頭にg1_がつくようになる。gauss1.guess(data, x=x)により初期パラメータを推定し、pars[‘g1_center’].set(value=2, min=1, max=3)のようにしてパラメータを設定していく。
設定後のパラメータの値は以下のようになる。
同様にして2つ目、3つ目の分布のパラメータ設定も行う。
2つ目
3つ目
pars.updateによりパラメータの追加が行われていることがわかる。
カーブフィット
modelをmod = gauss1 + gauss2 + gauss3
で定義して、mod.fit(data, pars, x=x)
によりフィッティングを行う。
フィッティング後のパラメータの値は以下のようになる。
フィッティング結果の表示
ベストフィットパラメータはout.best_values[‘パラメータ名’]で得ることができるが、より簡単な方法として、out.eval_components(x=x)を使う方法がある。これにより、各モデルごとにフィッティングデータを分離することができ、plot(x, comps[‘g1_’])のようにすることで、それぞれのフィッティングカーブをプロットすることができる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント
[…] Least-Squares Minimization and Curve-Fitting for Python サボテンパイソン [lmfit] 5. 混合モデルによるカーブフィッティング(prefixの使い方) […]