簡體   English   中英

在 python 中使用 lmfit 中的 Voigt 配置文件擬合數據 - 巨大錯誤

[英]Fitting data with Voigt profile in lmfit in python - huge errors

我正在嘗試使用 Voigt 配置文件(Python 中的 lmfit)擬合一些 RIXS 數據,並且我已按以下方式定義了 Voigt 配置文件:


def gfunction_norm(x, pos, gwid):
    gauss= (1/(gwid*(np.sqrt(2*np.pi))))*(np.exp((-1.0/2)*((((x-pos)/gwid))**2)))
    return (gauss-gauss.min())/(gauss.max()-gauss.min())

def lfunction_norm(x,pos,lwid):
    lorentz=(0.15915*lwid)/((x-pos)**2+0.25*lwid**2)
    return (lorentz-lorentz.min())/(lorentz.max()-lorentz.min())



def voigt(x, pos, gwid, lwid, int):
    step=0.005
    x2=np.arange(pos-7,pos+7+step,step)
    voigt3=np.convolve(gfunction_norm(x2, pos, gwid), lfunction_norm(x2, pos, lwid), mode='same')   
    norm=(voigt3-voigt3.min())/(voigt3.max()-voigt3.min()) 
    y=np.interp(energy, x2, norm)
    return y * int

我在 Python 中使用了這個定義而不是流行的 Voigt 配置文件定義:

def voigt(x, alpha, cen, gamma): 
    sigma=alpha/np.sqrt(2*np.log(2))
    return np.real(wofz((x-cen+1j*gamma)/sigma/np.sqrt(2)))/(sigma*2.51)

因為它讓我更清楚地了解峰的強度等。

現在,我有幾個具有 9-10 個峰的光譜,我正試圖用 Voigt 曲線擬合它們(正是我定義它的方式)。

現在,我有幾個問題:

  1. 你覺得我的 Voigt 定義可以嗎? 使用卷積而不是近似的第二定義有什么(不利)優勢?

  2. 由於我的健康,有時我會得到瘋狂的大標准差。 例如,這些是其中一個峰的最佳擬合參數:

    int8:    0.00986265 +/- 0.00113104 (11.47%) (init = 0.05)
    pos8:   -2.57960013 +/- 0.00790640 (0.31%) (init = -2.6)
    gwid8:   0.06613237 +/- 0.02558441 (38.69%) (init = 0.1)
    lwid8:   1.0909e-04 +/- 1.48706395 (1363160.91%) (init = 0.001)

(強度,position,分別為高斯和洛倫茲寬度)。 這個 output 是否意味着這個峰應該是純高斯峰?

  1. 我注意到當最佳擬合參數非常小時,通常會出現較大的錯誤。 這是否與 lmfit 默認使用的 Levenberg-Marquardt 算法有關? 我應該注意,即使我使用 Voigt 剖面的其他定義(而不僅僅是洛倫茲寬度),我有時也會遇到同樣的問題。 這是代碼的一部分(它是更大代碼的一部分,它在一個 for 循環中,這意味着我對多個相似的光譜使用相同的初始值):
    model = Model(final)
    result = model.fit(spectra[:,nb_spectra], params, x=energy)
    print(result.fit_report())

“最終”是我之前定義的許多 voigt 配置文件的總和。

謝謝!

這似乎是Lmfit fit 的重復或后續操作會產生巨大的不確定性- 請在每個主題的 SO 問題上使用。

您認為我的 Voigt 定義可以嗎? 使用卷積而不是近似的第二定義有什么(不利)優勢?

是什么讓你說第二個定義是近似的? 從某種意義上說,所有浮點計算都是近似的,但是來自 scipy.special.wofz 的 Faddeeva scipy.special.wofzVoigt 剖面的解析解。 自己進行卷積可能會慢一些,並且也是一個近似值(在機器精度級別)。

由於您使用的是 Lmfit,我建議使用它的VoigtModel這將使您的生活更輕松:它使用scipy.special.wofz和參數名稱,可以輕松切換到其他配置文件(例如GaussianModel )。

您沒有給出一個非常完整的代碼示例(供參考,SO 或多或少期望實際代碼的最小工作版本並強烈推薦),但這可能看起來像

from lmfit.models import VoigtModel

model = VoigtModel(prefix='p1_') + VoigtModel(prefix='p2_') + ...

由於我的健康,有時我會得到瘋狂的大標准差。 例如,這些是其中一個峰的最佳擬合參數:

 int8: 0.00986265 +/- 0.00113104 (11.47%) (init = 0.05) pos8: -2.57960013 +/- 0.00790640 (0.31%) (init = -2.6) gwid8: 0.06613237 +/- 0.02558441 (38.69%) (init = 0.1) lwid8: 1.0909e-04 +/- 1.48706395 (1363160.91%) (init = 0.001)

(強度,position,分別為高斯和洛倫茲寬度)。 這個 output 是否意味着這個峰應該是純高斯峰?

首先,這可能不是“瘋狂的大”標准差——它在某種程度上取決於數據和擬合的 rest。 也許int8的值真的非常小,並且與其他峰值嚴重重疊——它可能與其他變量高度相關。 但是,這很可能意味着峰值更像高斯分布。

由於您正在分析 X 射線散射數據,因此使用 Voigt function 可能部分證明材料響應會給出高斯分布的想法(斷言、假設、期望?),而儀器(包括 X 射線源) ) 會產生洛倫茲展寬。 這表明洛倫茲寬度對於各種峰可能是相同的,或者可能參數化為入射和散射波長或q值的簡單 function。 也就是說,您可能能夠(並且可能會更好)將洛倫茲寬度的值(我認為您的lwidlmfit.models.VoigtModel中的gamma )限制為相同。

事實上,我認為還有一個導致大錯誤的額外問題。 即,兩個數據點之間的距離大於洛倫茲寬度(最佳擬合參數)。 顯然,這沒有意義,我應該設置一個更大的最小邊界。 現在我面臨的問題是我的點數太少,但我必須用我所擁有的來工作。 非常感謝您的回答!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM