将2D函数拟合到具有python错误的2D数据集

时间:2012-10-12 15:38:47

标签: python numpy least-squares

我有一个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

1 个答案:

答案 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