はじめに
lmfitは非線形最小二乗法を用いてカーブフィットするためのライブラリであり、Scipy.optimize.curve_fitの拡張版に位置する。ここでは、フィッティングパラメータに代数的な制約を付与してカーブフィッティングする方法について説明する。
コード
解説
モジュールのインポートなど
バージョン
残差を返す関数の定義
2つのガウス関数が重なったmodel
を作成して、return
でmodel - data
として残差を返す関数を作成する。
ガウス分布データの生成
異なる分布を示すガウス分布を足し合わせたデータを作成する。
パラメータの設定
pfit = Parameters()
として辞書形式のパラメータを作成して、そこに.add
していくことでパラメータを追加していく。変数peak_split
でvalue=2.5, min=0, max=5, vary=True
とすることで初期値2.5で0から5まで変動するパラメータを作って、pfit.add(name='cen_2', expr='peak_split+cen_1')
とすることでcen_2
をcen_1
からcen_1+5
の範囲になるようにすることができる。
カーブフィット
Minimizer(residual, pfit, fcn_args=(x, data))
により、残差を返す関数residual
が最小となるようにパラメータを最適化する処理をする。mini.leastsq()
で最適化が行われ、out.residual
で残差を得ることができる。data + out.residual
とすることでフィットしたカーブのデータを得ることができる。
フィッティング後のパラメータの値は以下のようになる。
フィッティング結果の表示
代数的制約のためカーブフィットできていない事例
ピーク位置が2と7.5で差が5.5となっているデータの場合、代数的な制約で大きい方のピークが7までしかいけないため、フィッティング不十分な結果が得られる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)参考
Non-Linear Least-Squares Minimization and Curve-Fitting for Python — Non-Linear Least-Squares Minimization and Curve-Fitting for Python
Fit Using Inequality Constraint — Non-Linear Least-Squares Minimization and Curve-Fitting for Python
Performing Fits and Analyzing Outputs — Non-Linear Least-Squares Minimization and Curve-Fitting for Python
コメント