Python scipy中拟合算法的差异

Python scipy中拟合算法的差异,python,scipy,mathematical-optimization,curve-fitting,Python,Scipy,Mathematical Optimization,Curve Fitting,我有一个关于scipy中使用的拟合算法的问题。在我的程序中,我有一组只带有y错误的x和y数据点,并且想要拟合一个函数 f(x) = (a[0] - a[1])/(1+np.exp(x-a[2])/a[3]) + a[1] 去吧 问题是,使用两个fit-scipy-fit例程scipy.odr.odr(使用最小二乘算法)和scipy.optimize,我在参数上得到了高得离谱的误差,拟合参数的值和误差也不同。我举个例子: 与scipy.odr.odr配合,配合类型=2 Beta: [ 11.96

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

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

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

与scipy.odr.odr配合,配合类型=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,配合类型=2:
C=100.209+/-80600

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

我不知道为什么第一个错误会这么高。更好的是:如果我把完全相同的数据点和错误放在Origin 9中,我会得到 C=x0=9941849+/-020283

和再次完全相同的数据到C++根目录 C=99.85+/-1.373

尽管我对ROOT和Python使用了完全相同的初始变量。Origin不需要任何东西

你知道为什么会发生这种情况,哪一个是最好的结果吗

我在pastebin为您添加了代码:

  • Python代码:
    http://pastebin.com/jZVyzMkS
谢谢你的帮助


编辑:以下是与SirJohnFranklins post相关的绘图:

您是否确实尝试过并排绘制
ODR
leastsq
拟合?它们看起来基本相同:

考虑参数对应的是什么-由
beta[0]
beta[1]
描述的步长函数,即初始值和最终值,解释了数据中的大部分差异。相比之下,
beta[2]
beta[3]
拐点和斜率的微小变化对曲线的整体形状以及拟合的剩余方差的影响相对较小。因此,毫不奇怪,这些参数具有高标准误差,并且两种算法的拟合略有不同

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

(遗憾的是,我无法上传fit,因为我需要更多的声誉。我会把情节交给Sandwich船长,让他帮我上传。)

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

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

红色和绿色的曲线有一个不同的β,左边的一个减去根得到的拟合误差3.430,右边的一个加上误差。我认为这完全有意义,比原点9的拟合误差0.2更有意义(我认为它只能处理y误差)或者ODR给出的大约40k的误差,也包括x和y误差


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

你能在同一张图上绘制(1)
scipy.odr
和(2)x和y误差得到的拟合和误差吗
ROOT
带有x和y误差。另外,如果x和y误差是以不同的单位测量的,那么
ROOT
如何确定它们的相对权重?在
scipy.odr
中,
sx
sy
通过平方除以1.0来转换为权重-
ROOT
是否也这样做?我真的这么认为不要认为拟合的稳健性有任何问题-您尝试过的所有不同算法似乎都对模型参数给出了合理的估计。我认为唯一的问题是ODR报告拟合参数的标准误差。