gnuplotでガウシアン・フィッティング(重み付き)
以前やったこの方法だと、各データ点の重みがすべてデフォルトの値である1になってしまうということを知りました。そこで、gnuplotのマニュアルをついに手にすることに。日本語訳があって、本当に助かりました。
書式: fit {[xrange] {[yrange]}} <function> '<datafile>' {datafile-modifiers} via '<parameter file>' | <var1>{,<var2>,...}
`fit` コマンドはユーザ定義関数を (x,y) または (x,y,z) の形式のデータ点の集合への当てはめを可能にします。それにはMarquardt-Levenberg 法による非線形最小自乗法 (NLLS) の実装が用いられます。関数内部に現われるユーザ定義変数はいずれも当てはめのパラメータとして使うことができます。ただ、その関数の返り値は実数である必要があります。
当てはめる 1 変数関数 y=f(x) へのデフォルトのデータの書式は {x:}y かx:y:s で、これらはデータファイルへの `using` 指定子で変更できます。この 3 番目の項目 (列番号、または数式) が与えられた場合は、それは対応する y の値の標準偏差として解釈され、それはそのデータへの重み (=1/s**2)を計算するのに使われます。そうでなければ、全てのデータは同じ重み (1)で計算されます。`using` オプションを全く指定しなかった場合、3 列目のデータがあった場合でもデータから y の偏差は読まれませんので、その場合は重み 1 になります。
gnuplot > f(x) = a*exp(-(x-b)**2/(2*c**2)) gnuplot > fit [x_1 : x_2] f(x) "hogehoge.data" using 1:2:3 via a,b,c gnuplot > plot f(x), "hogehoge.data" [x_1 : x_2]:フィッティング範囲。 using :フィッティングに使用するコラムの指定。3列目にyの標準偏差 via :フィッティングする際に動かすパラメタの指定。
■ フィッティングのコツ
・パラメータの初期値にもっともらしい値を代入しておく。
・yがゼロになるところを含めるとフィットできない。