scipy中拟合算法的区别

5

我有一个关于scipy中使用的拟合算法的问题。在我的程序中,我有一组x和y数据点,只有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中使用了完全相同的初始变量,Origin也不需要任何变量。

您有任何线索为什么会发生这种情况以及哪个结果最好吗?

我已经在pastebin上为您添加了代码:

感谢您的帮助!

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


你能否在同一张图上绘制出使用(1)带有x和y误差的scipy.odr和(2)带有x和y误差的ROOT所得到的拟合和误差?此外,由于x和y误差是用不同的单位测量的,ROOT如何确定相对加权给予它们?在scipy.odr中,sxsy通过将1.0除以它们的平方来转换为权重 - ROOT是否也这样做? - ali_m
2个回答

1

你实际上尝试过将ODRleastsq拟合结果并排绘制在一起吗?它们看起来基本相同:

enter image description here

考虑参数对应的内容 - 由 beta[0]beta[1] 描述的阶跃函数,即初始值和最终值,远远解释了数据中的大部分差异。相比之下,beta[2]beta[3],即拐点和斜率的微小变化,对曲线的整体形状和拟合残差的影响较小。因此,这些参数具有较高的标准误差,并且两种算法的拟合略有不同。 ODR 报告的整体更高的标准误差是因为该模型包含 y 值的误差,而普通最小二乘拟合则没有 - 测量 y 值的误差应降低我们对估计拟合参数的信心。

0

很遗憾,我无法上传配适的数据,因为我需要更多的声望。我会把它给Captain Sandwich,让他帮我上传。

我与发起该主题的人在同一个工作组,但是这个配适是我做的。

因此,我在数据上添加了x误差,因为我上次没有那么远。通过ODR得到的误差仍然非常高(beta [2]上的4.18550164e + 04)。在图中,我展示了来自[ROOT Cern] [2]的拟合线,现在有了x和y的误差。在此,x0是beta [2]。

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

也许,因为ROOT主要被天体物理学家使用,他们需要非常强大的拟合算法,所以它可以处理更困难的拟合,但我对拟合算法的强壮性不够了解。


我真的不认为拟合的鲁棒性存在任何问题 - 你尝试的所有不同算法似乎都给出了模型参数的合理估计。我心中唯一的疑问是关于ODR对拟合参数标准误差的报告。 - ali_m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接