scipy中拟合算法的区别

时间:2013-06-28 16:34:49

标签: python scipy mathematical-optimization curve-fitting

我对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)

My Point是第三个拟合参数:结果是

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相关的情节:see comment below

2 个答案:

答案 0 :(得分:1)

您是否真的尝试并排绘制ODRleastsq?它们看起来基本相同:

enter image description here

考虑参数对应的内容 - beta[0]beta[1]描述的步骤函数,初始值和最终值,到目前为止解释了数据中的大部分差异。相比之下,beta[2]beta[3]的小变化(拐点和斜率)对曲线的整体形状的影响相对较小,因此对拟合的残差方差影响较小。因此,这些参数具有高标准误差并且两种算法的拟合略有不同,这并不奇怪。

ODR报告的整体更高的标准误差是由于这个模型包含y值的误差,而普通的最小二乘拟合没有 - 测得的y值中的误差应该减少我们的对估计的拟合参数的信心。

答案 1 :(得分:0)

(可悲的是,我无法上传合适的内容,因为我需要更多的声誉。我会把情节给三明治上尉,所以他可以上传给我。)

我和创建帖子的人在同一个工作组,但我做了这个情节。

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

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

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