2

以下に示すように、peak-o-matを使用して曲線を ax/y データセットに適合させることができました。これは、線形の背景と 10 個のローレンツ曲線です。 ピーク・オ・マットの結果

多くの同様の曲線をフィッティングする必要があるため、Levenberg-Marquardt-Algorithm であるmpfit.pyを使用して、スクリプト化されたフィッティング ルーチンを作成しました。ただし、フィットには時間がかかり、私の意見では、peak-o-mat の結果よりも精度が低くなります。

開始値 開始値

固定された線形バックグラウンドでの結果の適合(peak-o-mat の結果から得られた線形バックグラウンドの値) フィット固定

すべての変数を自由にして結果を当てはめる フィットフリー

開始値はすでに非常に近いと思いますが、線形の背景が固定されている場合でも、左ローレンツ分布は明らかに適合度を低下させます。

完全なフリー フィットの場合、結果はさらに悪化します。

Peak-o-mat はscipy.odr.odrpackを使用しているようです。今、より可能性が高いもの:

  1. 私はいくつかの実装エラーをしましたか?
  2. odrpack は、この特定の問題により適していますか?

より単純な問題 (中央に 1 つのピークがある線形データ) に当てはめると、peak-o-mat とスクリプトの間に非常に良い相関関係が示されます。また、ordpackについてはあまり見つけられませんでした。

編集:私は自分で質問に答えることができたようですが、答えは少し不安です. scipy.odr (odr または leastsq 法でのフィッティングを可能にする) を使用すると、制約がなくても結果がpeak-o-mat として得られます。

下の画像は、再びデータ、開始値 (ほぼ完璧)、そして odr と leastsq の適合を示しています。コンポーネント曲線は、odr のものです。

scipy.odr

私はodrに切り替えますが、これはまだ私を動揺させます. メソッド (leastsq モードの mpfit.py、scipy.optimize.leastsq、scipy.odr) は、同じ結果をもたらすはずです。

そして、この投稿に出くわした人のために: ODR フィットを行うには、x と y の値にエラーを指定する必要があります。エラーがなければ、sx << sy で小さい値を使用します。

linear = odr.Model(f)
mydata = odr.RealData(x, y, sx = 1e-99, sy = 0.01)
myodr = odr.ODR(mydata, linear, beta0 = beta0, maxit = 2000)
myoutput1 = myodr.run() 
4

1 に答える 1

1

スクリプト作成にもpeak-o-matを使用できます。最も簡単な方法は、GUI を介して適合させたいすべてのデータを含むプロジェクトを作成し、それをクリーンアップして変換し、ベース モデルをセットの 1 つにアタッチ (つまり、モデルを選択し、最初の推測を提供して適合させる) することです。次に、そのモデルを (ディープ) コピーして、他のすべてのデータ セットにアタッチできます。これを試して:

from peak_o_mat.project import Project
from peak_o_mat.fit import Fit
from copy import deepcopy

p = Project()
p.Read('in.lpj')

base = p[2][0]    # this is the set which has been fit already

for data in p[2][1:]: # all remaining sets of plot number 2

    mod = deepcopy(base.mod)
    data.mod = mod

    f = Fit(data, data.mod)
    res = f.run()

    pars = res[0]
    err = res[1]

    data.mod._newpars(pars, err)

    print data.mod.parameters_as_table()

p.Write('out')

詳細が必要な場合は教えてください。

于 2012-07-08T12:38:17.410 に答える