1

我有一个 2D np.array 作为实验数据,所以形状像(50,50),对应于我的凸轮的像素。对于每个点的错误,我都有第二个相同形状的 np.array。所以我的错误不仅仅是 sqrt(n)。我想使用这些错误进行拟合,因此使用 sum( (experimental - function)^2 / (error of the pixel)^2 )。

到目前为止,为了处理 2D,我只是将我的错误函数展平为最小平方的输入。这完美地工作。因此,考虑到错误,我有合适的参数。但是有一个问题:我如何告诉 leastsq 它也必须使用它们来计算我的 fitparameters 的误差?我查看了curve_fit,但它似乎绝对不是为我的情况设计的。在我看来,它需要一个函数,您可以将 x 作为输入。但是通过我的卷积,我不能简单地将 x 值转换为 y 值。

那么有没有办法用 minimumsq、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
4

1 回答 1

1

这是我写的一个简短的函数,灵感来自于 curve_fit 的作用。你可以给她一个二维数组作为错误函数的输入,但不是必须的。误差函数是 (fitfunc(v) - img) /errimg,其中 errimg 是一个与 img 形状相同的矩阵,在每个数据点上都充满了错误。输出与 leastsq 相同,但协方差矩阵已得到纠正。

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
于 2012-10-25T09:05:17.393 回答