我有很多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 …Run Code Online (Sandbox Code Playgroud)