[英]How do I perform a gaussian curve fit in the presence of a linear background with scipy?
你必須以某種方式模擬背景和高斯峰值,以及光譜中的任何其他峰值。 你的背景看起來是大約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.