scipy.optimize.curvefit:拟合中的不对称误差

时间:2013-10-01 12:45:18

标签: python scipy curve-fitting

我尝试使用scipy.optimize.curvefit将函数拟合到我的数据中。

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

它运作良好。

但是,现在我正在尝试使用非对称错误,我不知道该怎么做 - 或者即使它是可能的。

非对称错误我的意思是错误不是例如:3+-0.5而是3 +0.6 -0.2。 因此ERR是一个包含两列的数组。

如果有人知道如何做到这一点会很棒 - 或者我可以指出一个可能能够做到的不同的Python例程。

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

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)

错误= [ErP,ErM](2列)

4 个答案:

答案 0 :(得分:1)

在当前版本中,恐怕不可行。 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),)

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

这意味着如果你想在Y上有不对称的错误残留,你必须对你的目标函数进行一些修改,就像@Jaime建议的那样。

答案 1 :(得分:1)

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

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

否则,您可以使用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 :(得分:0)

我不是百分百肯定,但看起来PAIDA包可能适合非对称错误:

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

答案 3 :(得分:0)

我经常使用的一种解决方案是从正态分裂分布中提取实现(例如100-1000),并对每个实现运行拟合算法,并将误差设置为0.0。然后,您将获得100-1000个最适合的参数,您可以从中简单获取中位数以及要使用的任何误差估计。