将数据拟合到高斯分布时如何在 lmfit 中包含误差线?

How to include error bars in lmfit when fitting data to Gaussian profile?

我正在使用 lmfit 将我的数据拟合到高斯分布。我试图完成三件事: 1)了解lmfit中的误差是如何计算的 2) 如何在 lmfit 中包含我自己的计算误差 3) 如何绘制拟合内的误差

def gaussian(x, amp, cen, fwhm):
    return + amp * np.exp(-(x - cen) ** 2 / (2 * (fwhm / 2.35482) ** 2))    

def gaussian_fit(x,y,guess=[1,0,0,5],varies=[True,True,True,True]):

c = 299792458 #m/s
gmod = Model(gaussian)
gmod.nan_policy = 'omit'
#x,y - your dataset to fit, with x and y values
print (np.max(y))
gmod.set_param_hint('amp', value=guess[0],vary=varies[0])  
gmod.set_param_hint('cen', value=guess[1],vary=varies[1])
gmod.set_param_hint('fwhm', value=guess[2],vary=varies[2])  
gmod.make_params()

result = gmod.fit(y,x=x,amp=guess[0], cen=guess[1], fwhm=guess[2])

amp = result.best_values['amp']
cen = result.best_values['cen']
fwhm = result.best_values['fwhm']
#level = result.best_values['level']
sigma = fwhm / 2.35482
c = 299792458 #m/s
print(result.fit_report())

gaussfield = amp * np.sqrt(2 * np.pi * sigma ** 2)
residual = y - result.best_fit

print ('params:',amp,cen,fwhm,sigma,gaussfield)
return amp,cen,fwhm,sigma,gaussfield,residual

amp, cen, fwhm, sigma, gaussfield, residual 
= gaussian_fit(xdata,ydata,guess=[.1,6.9,.02],varies=[True,False,False]) 

我没有看到错误包含在脚本中的什么地方,所以它们是如何包含在最终报告中的?你怎么能包含你自己的错误而不是 lmfit 的错误,你怎么能最终绘制这些错误?

首先,我建议只使用 lmfit.models.GaussianModel,而不是使用 set_param_hint() -- 只是明确,不要聪明 -- 如:

from lmfit.models import GaussianModel
gmodel = GaussianModel()
params = gmodel.make_params(amplitude=1, center=0, sigma=2)
result = gmodel.fit(y, params, x=x)

print(result.fit_report())

现在,回答您的问题:

  1. best-fit 参数中的不确定性是通过查看更改参数值将如何改变拟合来估计的。将 chi-square 定义为残差数组 (data-fit)/data_uncertainty 的平方和,每个参数(以及 parameter-parameter 相关性)的不确定性被估计为将 chi-square 增加 1 的值. 还有更多 in-depth 资源可用于了解 non-linear least-squares 拟合的工作原理。

  2. "How to include my own calculated errors in lmfit"。在这里,我猜你指的是 y 数据 中的不确定性 ,而不是参数中的不确定性(比如你怎么知道不确定性而不是值?)。如果您的数据存在不确定性,请将其作为 weights 数组传递给 Model.fit,也许作为

    result = gmodel.fit(y, params, x=x, weights=1.0/dely)

  3. 如何绘制拟合误差。您可以使用 matplotlibs errorbar 函数绘制数据及其误差线。如果要绘制参数不确定性对 best-fit 曲线预期范围的影响,可以使用 delmodel = result.eval_uncertainty(x=x) 然后绘制 x vs result.best_fit + delmodelresult.best_fit - delmodel。 Matplotlib 的 fill_between 函数通常对此很有用。