[英]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.