我有一个2D np.array作为实验数据,所以形状像(50,50),对应于我的像素。我有一个相同形状的第二个np.array,每个点都有错误。所以我的错误不仅仅是sqrt(n)。我想将这些误差用于拟合,所以使用sum((实验 - 函数)^ 2 /(像素的误差)^ 2)。
到目前为止,为了处理2D我只是将我的错误函数展平为minimalsq的输入。这非常有效。所以考虑到错误,我有适合的参数。但是有一个问题:我如何告诉leastsq它还使用它们来计算我的fitparameters上的错误? 我看了一下curve_fit,但似乎绝对没有为我的情况设计。在我看来,它需要一个函数,你可以给一个x作为输入。但是通过我的卷积,我不能简单地将y值转换为x值。
有没有办法用minimalsq,curve_fit或其他函数来做到这一点?
以下是没有处理fitparameters错误的脚本:
#img is my experimental data, errimg the array with the errors.
#My fitfunction is a convolution of a bivariate_normal with a circular
#box-function given by a function i called ellipsenmatrix.
tx = np.arange(-100,100,1.)
ty = np.arange(-100,100,1.)
X, Y = np.meshgrid(tx, ty)
circ= lambda x: ellipsenmatrix([24.,24.,x],shape=img.shape,kreis='on')
def fitfunc(v):
conv= ndimage.convolve( circ(v[4]), mlab.bivariate_normal(X, Y, v[0], v[1], v[2], v[3], 0) )
conv/=np.sum(conv)
return conv
errfunc = lambda v: ( (fitfunc(v) - img) /errimg ).flatten()
vinit=[2.5,2.5,0,0,27.5]
vend, kovmtx, einstell, mesg, success = optimize.leastsq(errfunc, vinit, full_output=True)
print vend
答案 0 :(得分:1)
这是一个我写的灵感来自curve_fit的短函数。你可以给她一个2D数组作为错误函数的输入但不必。错误函数是(fitfunc(v) - img)/ errimg,其中errimg是与每个数据点上的img充满错误形状相同的矩阵。输出与最小值相同,但校正了协方差矩阵。
def leastsqplus(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0,ftol=1.49012e-8, xtol=1.49012e-8, gtol=0.0, maxfev=0, epsfcn=0.0, factor=100, diag=None):
func=func.flatten()
vend, kovmtx, einstell, mesg, success = optimize.leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
X2 = np.sum( func(vend)**2 )
ndf = ( len(func(vend)) - len(vend) )
X2ndf= X2 / ndf
kovmtx *= X2ndf
return vend, kovmtx, einstell, mesg, success