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]
同样但是y_err乘以2:
所以你可以看到这些值是相同的。这告诉我算法没有考虑到它们,但我认为这些值应该不同。
我也在这里读到了另一种拟合方法,所以我也尝试使用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]
我应该回答我的问题还是现在关闭/删除它?
scipy.odr
的回答中的评论)。 - Ffisegyddcurve_fit
有一个名为absolute_sigma
的选项,请参考http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.curve_fit.html。在此添加之前,对其含义进行了长时间的讨论。 - Josef