5

我对 scipy 中使用的拟合算法有疑问。在我的程序中,我有一组只有 y 错误的 x 和 y 数据点,并且想要拟合一个函数

f(x) = (a[0] - a[1])/(1+np.exp(x-a[2])/a[3]) + a[1]

给它。

问题是我使用两个拟合 scipy 拟合例程 scipy.odr.ODR(使用最小二乘算法)和 scipy.optimize 在参数上得到了高得离谱的错误以及拟合参数的不同值和错误。我举个例子:

适合 scipy.odr.ODR,fit_type=2

Beta: [ 11.96765963 68.98892582 100.20926023 0.60793377]
Beta Std Error: [ 4.67560801e-01 3.37133614e+00 8.06031988e+04 4.90014367e+04]
Beta Covariance: [[ 3.49790629e-02 1.14441187e-02 -1.92963671e+02 1.17312104e+02]
[ 1.14441187e-02 1.81859542e+00 -5.93424196e+03 3.60765567e+03]
[ -1.92963671e+02 -5.93424196e+03 1.03952883e+09 -6.31965068e+08]
[ 1.17312104e+02 3.60765567e+03 -6.31965068e+08 3.84193143e+08]]
Residual Variance: 6.24982731975
Inverse Condition #: 1.61472215874e-08
Reason(s) for Halting:
Sum of squares convergence

然后与 scipy.optimize.leastsquares 配合:

适合 scipy.optimize.leastsq

beta: [ 11.9671859 68.98445306 99.43252045 1.32131099]
Beta Std Error: [0.195503 1.384838 34.891521 45.950556]
Beta Covariance: [[ 3.82214235e-02 -1.05423284e-02 -1.99742825e+00 2.63681933e+00]
[ -1.05423284e-02 1.91777505e+00 1.27300761e+01 -1.67054172e+01]
[ -1.99742825e+00 1.27300761e+01 1.21741826e+03 -1.60328181e+03]
[ 2.63681933e+00 -1.67054172e+01 -1.60328181e+03 2.11145361e+03]]
Residual Variance: 6.24982904455 (calulated by me)

我的观点是第三个拟合参数:结果是

scipy.odr.ODR,fit_type=2: C = 100.209 +/- 80600

scipy.optimize.leastsq: C = 99.432 +/- 12.730

我不知道为什么第一个错误要高得多。更好的是:如果我将具有错误的完全相同的数据点放入 Origin 9,我会得到 C = x0 = 99,41849 +/- 0,20283

再次将完全相同的数据放入 c++ ROOT Cern C = 99.85+/- 1.373

即使我为 ROOT 和 Python 使用了完全相同的初始变量。起源不需要任何东西。

你有什么线索为什么会发生这种情况,哪个是最好的结果?

我在 pastebin 为你添加了代码:

感谢您的帮助!

编辑:这是与 SirJohnFranklins 帖子相关的情节:见下面的评论

4

2 回答 2

1

你真的尝试过并排绘制ODR和拟合吗?leastsq它们看起来基本相同:

在此处输入图像描述

考虑参数对应的内容 - 由beta[0]和描述的阶跃函数beta[1]、初始值和最终值,解释了迄今为止数据中的大部分方差。相比之下,拐点和斜率beta[2]beta[3]的微小变化对曲线的整体形状以及因此拟合的剩余方差的影响相对较小。因此,这些参数具有很高的标准误差也就不足为奇了,并且两种算法的拟合略有不同。

报告的总体标准误差较大ODR是因为该模型包含 y 值中的误差,而普通最小二乘拟合没有 - 测量的 y 值中的误差应该降低我们对估计拟合参数的信心。

于 2013-06-28T23:10:29.880 回答
0

(很遗憾,我不能上传合体,因为我需要更多的声望。我会把情节交给三明治船长,他可以帮我上传。)

我和发起线程的人在同一个工作组,但我做了这个情节。

所以,我在数据上添加了 x-errors,因为我上次没有那么远。通过 ODR 获得的误差仍然高得离谱(在 beta[2] 上为 4.18550164e+04)。在图中,我向您展示了 [ROOT Cern][2] 中的 FIT 给出的结果,现在带有 x 和 y 误差。这里,x0 是 beta[2]。

红色和绿色曲线的 beta 不同,左边的减去 ROOT 得到的 3.430 的拟合误差,右边的加上误差。我认为这比 Origin 9 的拟合给出的 0.2 的误差(我认为只能处理 y 误差)或 ODR 给出的大约 40k 的误差(也包括 x 和 y)更有意义。错误。

也许,因为 ROOT 主要被需要非常鲁棒拟合算法的天体物理学家使用,它可以处理更困难的拟合,但我对拟合算法的鲁棒性知之甚少。

于 2013-06-29T14:51:58.080 回答