【发布时间】:2016-12-04 20:21:54
【问题描述】:
我有很多 x-y 数据点在 y 上有误差,我需要拟合非线性函数。这些函数在某些情况下可以是线性的,但更常见的是指数衰减、高斯曲线等。 SciPy 支持这种与scipy.optimize.curve_fit 的拟合,我也可以指定每个点的权重。这给了我很好的加权非线性拟合。从结果中,我可以提取参数及其各自的错误。
只有一个警告:错误仅用作权重,但不包含在错误中。如果我将所有数据点的误差加倍,我预计结果的不确定性也会增加。所以我建立了一个测试用例(source code)来测试这个。
适合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]
我应该回答我的问题还是现在关闭/删除它?
【问题讨论】:
-
也许 statsmodels 可以做到这一点;我不确定它是否可以处理一般曲线拟合。
-
不要扔掉你写的所有东西——回答它,谁知道呢,也许有人知道更好的方法。
-
用你发现的东西肯定回答你的问题(感谢你对我之前讨论
scipy.odr的答案之一的评论)。 -
在 scipy 0.14 docs.scipy.org/doc/scipy-0.14.0/reference/generated/… 中查看
absolute_sigma选项curve_fitdocs.scipy.org/doc/scipy-0.14.0/reference/generated/… 在添加此内容之前,对此的含义进行了长时间的讨论。 -
@user333700 我的系统上安装了 0.13,但我认为还没有这个选项。刚刚在 0.14 中添加?然后我可能不得不等待或手动安装它。