3

我尝试使用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)

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

4

4 回答 4

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()

并用fminor最小化它fmin_bfgs

(我从来没有试过这个。)

于 2013-10-02T02:31:47.853 回答
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),)

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

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

于 2013-10-01T15:15:32.707 回答
0

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

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

于 2013-10-01T15:34:09.903 回答
0

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

于 2019-01-30T10:23:08.943 回答