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

Mar*_*ing 8 python numpy scipy

我有很多yy数据点,y需要适应非线性函数.在某些情况下,这些函数可以是线性的,但更通常是指数衰减,高斯曲线等.SciPy支持这种拟合scipy.optimize.curve_fit,我也可以指定每个点的权重.这给了我加权的非线性拟合,这很好.从结果中,我可以提取参数及其各自的错误.

只有一点需要注意:错误仅用作权重,但不包含在错误中.如果我将所有数据点的误差加倍,我预计结果的不确定性也会增加.所以我构建了一个测试用例(源代码)来测试它.

适合scipy.optimize.curve_fit给我:

Parameters: [ 1.99900756  2.99695535]
Errors:     [ 0.00424833  0.00943236]
Run Code Online (Sandbox Code Playgroud)

相同但有2 * y_err:

Parameters: [ 1.99900756  2.99695535]
Errors:     [ 0.00424833  0.00943236]
Run Code Online (Sandbox Code Playgroud)

相同但有2*y_err:

所以你可以看到值是相同的.这告诉我算法没有考虑到这些,但我认为值应该是不同的.

我在这里也读到了另一种合适的方法,所以我也尝试了scipy.odr:

Beta: [ 2.00538124  2.95000413]
Beta Std Error: [ 0.00652719  0.03870884]
Run Code Online (Sandbox Code Playgroud)

相同但有20 * y_err:

Beta: [ 2.00517894  2.9489472 ]
Beta Std Error: [ 0.00642428  0.03647149]
Run Code Online (Sandbox Code Playgroud)

值略有不同,但我认为这可以解释错误的增加.我认为这只是围绕错误或有点不同的权重.

是否有一些软件包允许我适应数据并获得实际错误?我在书中有公式,但如果我不需要,我不想自己实现.


我现在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]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ing 6

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

这个过程会重复大约 300 到几千次。最终将得到拟合参数的分布,其中可以采用平均值和标准差来获得值和误差。

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

在此输入图像描述

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