线性拟合,包括所有与NumPy / SciPy有关的错误


问题内容

我有很多xy数据点,这些数据点上存在y的错误,我需要将非线性函数拟合到其中。这些函数在某些情况下可以是线性的,但通常是指数衰减,高斯曲线等。SciPy使用来支持这种拟合scipy.optimize.curve_fit,我还可以指定每个点的权重。这给了我加权的非线性拟合很大。从结果中,我可以提取参数及其各自的错误。

只有一个警告:错误仅用作权重,但不包括在错误中。如果我将所有数据点上的误差加倍,我希望结果的不确定性也会增加。因此,我构建了一个测试用例(源代码)进行测试。

适合scipy.optimize.curve_fit给我:

Parameters: [ 1.99900756  2.99695535]
Errors:     [ 0.00424833  0.00943236]

相同,但2 * y_err

Parameters: [ 1.99900756  2.99695535]
Errors:     [ 0.00424833  0.00943236]

相同,但带有2 * y_err:

因此,您可以看到这些值是相同的。这告诉我算法没有考虑到这些,但是我认为值应该不同。

我也在这里阅读了另一种适合方法,因此我也尝试与之适合scipy.odr

Beta: [ 2.00538124  2.95000413]
Beta Std Error: [ 0.00652719  0.03870884]

相同,但20 * y_err

Beta: [ 2.00517894  2.9489472 ]
Beta Std Error: [ 0.00642428  0.03647149]

值略有不同,但是我确实认为这完全可以解释错误的增加。我认为这只是四舍五入误差或一些不同的权重。

是否有一些软件包可以让我拟合数据并获取实际错误?我有一本书中的公式,但是如果不需要,我不想自己实现。


我现在已经阅读了linfit.py另一个问题。这可以很好地处理我的想法。它支持两种模式,第一种是我需要的。

Fit with linfit:
Parameters: [ 2.02600849  2.91759066]
Errors:     [ 0.00772283  0.04449971]

Same but with 20 * y_err:
Parameters: [ 2.02600849  2.91759066]
Errors:     [ 0.15445662  0.88999413]

Fit with linfit(relsigma=True):
Parameters: [ 2.02600849  2.91759066]
Errors:     [ 0.00622595  0.03587451]

Same but with 20 * y_err:
Parameters: [ 2.02600849  2.91759066]
Errors:     [ 0.00622595  0.03587451]

我应该回答我的问题还是立即关闭/删除它?


问题答案:

引导方法是一种行之有效的方法,实际上可以提供更好的结果。当给出有错误的数据点时,使用一个参数引导程序,让每个xy值描述一个高斯分布。然后,将从每个分布中得出一个点,并获得一个新的自举示例。执行简单的未加权拟合将为参数提供一个值。

重复此过程约300至数千次。最终将得到拟合参数的分布,在其中可以取均值和标准差来获取值和误差。

另一件事是,结果不会获得一条拟合曲线,而是很多。对于每个内插值,x可以再次取许多值的均值和标准差f(x, param)并获得误差带:

在此处输入图片说明

然后,使用各种拟合参数再次执行数百次分析中的其他步骤。从上图中可以清楚地看到,这还将考虑拟合参数的相关性:尽管将对称函数拟合到数据,但误差带是非对称的。这将意味着左侧的插值值比右侧的插值值具有更大的不确定性。