簡體   English   中英

如何在存在線性背景和scipy的情況下執行高斯曲線擬合?

[英]How do I perform a gaussian curve fit in the presence of a linear background with scipy?

我有給定的數據集:

在此輸入圖像描述

其中我想在紅色箭頭指向的點處擬合高斯曲線。 我試圖通過將數據點限制在接近峰值的通道范圍內,使用scipy.optimize.curve_fitgaussian函數來獲得擬合,如下所示。

在此輸入圖像描述

然而,該方法沒有考慮數據點的背景噪聲的斜率。 因此,通過上述方法影響擬合曲線的峰值位置的精度。

我想考慮這個背景斜率。 我如何在python中這樣做?

你必須以某種方式模擬背景和高斯峰值,以及光譜中的任何其他峰值。 你的背景看起來是大約1/x (或其他一些功率x ),但它也可能是指數。 您可能知道這一點,或者您可能會發現在半對數圖上繪圖可以幫助確定哪些形式更好。

要使用curve_fit來擬合背景和高斯,你必須編寫一個模擬兩者的模型函數。 請允許我建議使用lmfit( http://lmfit.github.io/lmfit-py/ ),因為它有幾個內置模型,可以幫助您組成幾種不同線形的模型。 可能對您的問題有幫助的示例是( http://lmfit.github.io/lmfit-py/builtin_models.html#example-3-fitting-multiple-peaks-and-using-prefixes )。

適合您數據的腳本可能看起來像

import numpy as np
from lmfit.models import PowerLawModel, ExponentialModel, GaussianModel

# make models for individual components
mod_expon = ExponentialModel(prefix='exp_')
mod_gauss = GaussianModel(prefix='g1_')

# sum components to make a composite model (add more if needed)
model  = mod_expon + mod_gauss

# create fitting parameters by name, give initial values
params = model.make_params(g1_amplitude=5, g1_center=55, g1_sigma=5, 
                           exp_amplitude=5, exp_decay=10)

# do fit
result = model.fit(ydata, params, x=xdata)

# print out fitting statistics, best-fit parameters, uncertainties,....
print(result.fit_report())

文檔中還有更多示例,包括如何提取和繪制各個組件,等等。

我如何做到這一點是使用適合信號背景的擬合。 也就是說,不僅適合高斯,而且適合高斯,加上適合背景的功能。 背景的第一個近似值是線性斜率,因此您可以使用類似a*exp(-(x-x0)**2/w**2) + m*x + c

這為您提供了更多的擬合參數,所有參數都是相互依賴的,但是如果您可以給它們合理的初始值,那么擬合通常會很好地收斂。

暫無
暫無

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

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