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)
我应该回答我的问题还是现在关闭/删除它?
一种行之有效且实际上能提供更好结果的方法是引导方法。当给出有错误的数据点时,我们使用参数引导程序并让每个x和y值描述高斯分布。然后,我们将从每个分布中抽取一个点并获得一个新的引导样本。执行简单的未加权拟合会给出参数的一个值。
这个过程会重复大约 300 到几千次。最终将得到拟合参数的分布,其中可以采用平均值和标准差来获得值和误差。
另一件巧妙的事情是,结果得到的不是一条拟合曲线,而是很多条拟合曲线。对于每个插值x,可以再次取多个值的平均值和标准差f(x, param),并获得误差带:
然后使用各种拟合参数再次执行数百次分析中的进一步步骤。然后,这还将考虑拟合参数的相关性,正如我们在上图中可以清楚地看到的那样:尽管对称函数拟合到了数据,但误差带是不对称的。这意味着左侧的插值比右侧的插值具有更大的不确定性。
| 归档时间: |
|
| 查看次数: |
3635 次 |
| 最近记录: |