【问题标题】:scipy.optimize.curvefit: Asymmetric error in fitscipy.optimize.curvefit:拟合中的不对称误差
【发布时间】:2013-10-07 15:10:55
【问题描述】:

我尝试使用 scipy.optimize.curvefit 为我的数据拟合一个函数。

Q=optimization.curve_fit(func,X,Y, x0,ERR)

而且效果很好。

但是,现在我正在尝试使用不对称错误,但我不知道如何做到这一点 - 或者即使它是可能的。

不对称错误是指错误不是例如:3+-0.5,而是3 +0.6 -0.2。 所以 ERR 是一个有两列的数组。

如果有人知道如何做到这一点,那就太好了 - 或者我可以指出一个不同的 Python 例程,它可能能够做到这一点。

我正在使用的代码的 sn-p - 但我不确定它是否更清晰:

A=numpy.genfromtxt('WF.dat')
cc=A[:,4]
def func(A,a1,b1,c1):
    N=numpy.zeros(len(x))
    for i in range(len(x)):
        N[i]=1.0*erf(a1*(A[i,1]-c1*A[i,0]**b1))

return N


x0   = numpy.array([2.5  , -0.07 ,-5.0])
Q=optimization.curve_fit(func,A,cc, x0, Error)

And Error=[ErP,ErM](2 列)

【问题讨论】:

  • 您能否发布一些(最好是可运行的)代码,以便我们更详细地查看问题?
  • 你不能简单地将3 +0.6 -0.2转换成3.2 +/- 0.4吗?
  • 并非如此。这将破坏出现如此精确错误的目的。
  • 如果您按照 E 先生的建议进行操作,并包含一个简单、可运行的示例来突出该问题,那么人们解决这个问题可能会更有趣。不是从文件中加载数据,而是生成非对称高斯并添加一些随机噪声(np.random.random)。然后解决方案可以尝试拟合这个并获得均值的不对称误差。

标签: python scipy curve-fitting


【解决方案1】:

curve_fitscipy.optimize.leastsq 这样的最小二乘算法将无法做到这一点,因为损失函数是二次的,因此正负误差对称。

正如 DanHickstein 所说,我还没有看到任何模型,也许 PAIDA 可以处理它。

否则,您可以使用像 optimize.fmin 这样的非线性优化器并构建自己的非对称损失函数。

def loss_function(params, ...):
    error = (y - func(x, params))
    error_neg = (error < 0)
    error_squared = error**2 / (error_neg * sigma_low + (1 - error_neg) * sigma_upp))
    return error_squared.sum()

并使用fminfmin_bfgs 将其最小化。

(我从未尝试过。)

【讨论】:

    【解决方案2】:

    在目前的版本中,恐怕是行不通的。 curve_fit 是流行的 Fortran 库 minipack 的一个包装。查看\scipy_install_path\optimize\minipack.py的源码,你会看到:(498-509行):

    if sigma is None:
        func = _general_function
    else:
        func = _weighted_general_function
        args += (1.0/asarray(sigma),)
    

    基本上它的意思是没有提供sigma,那么minipack中的未加权Levenberg-Marquardt方法将被调用。如果提供了sigma,则将调用加权LM。这意味着,如果要提供sigma,它必须作为XY 的相同长度的数组提供。

    这意味着如果您想在 Y 上保留不对称错误残基,您必须按照 @Jaime 的建议对目标函数进行一些修改。

    【讨论】:

      【解决方案3】:

      我不是 100% 确定,但看起来 PAIDA 包可能确实适合不对称错误:

      http://paida.sourceforge.net/documentation/fitter/index.html

      【讨论】:

        【解决方案4】:

        我经常使用的解决方案是从分流正常分布绘制实现(例如100-1000),并在将错误设置为0.0的情况下运行拟合算法。然后,您将拥有100-1000个最佳参数,您可以简单地获取中位数,以及您想要使用的任何错误估计。

        【讨论】:

          猜你喜欢
          • 2019-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          相关资源
          最近更新 更多