我尝试使用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列)
答案 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),)
基本上意味着没有提供sigma
,minipack
中的未加权Levenberg-Marquardt方法将被调用。如果提供sigma
,则将调用加权的LM。这意味着,如果要提供sigma
,则必须将其提供为X
或Y
相同长度的数组。
这意味着如果你想在Y
上有不对称的错误残留,你必须对你的目标函数进行一些修改,就像@Jaime建议的那样。
答案 1 :(得分:1)
像curve_fit
或scipy.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()
并使用fmin
或fmin_bfgs
最小化此内容。
(我从未尝试过这个。)
答案 2 :(得分:0)
我不是百分百肯定,但看起来PAIDA包可能适合非对称错误:
http://paida.sourceforge.net/documentation/fitter/index.html
答案 3 :(得分:0)
我经常使用的一种解决方案是从正态分裂分布中提取实现(例如100-1000),并对每个实现运行拟合算法,并将误差设置为0.0。然后,您将获得100-1000个最适合的参数,您可以从中简单获取中位数以及要使用的任何误差估计。