1

私は実験データとして 2D np.array を持っているので、カムのピクセルに対応する (50,50) のような形状のものです。各ポイントのエラーに対して同じ形状の 2 番目の np.array があります。したがって、私のエラーは sqrt(n) だけではありません。これらの誤差を適合に使用したいので、 sum( (experimental - function)^2 / (error of the pixel)^2 ) を使用します。

これまでは、2D を処理するために、最小平方の入力としてエラー関数を平坦化していました。これは完全に機能します。したがって、エラーを考慮してパラメーターを適合させます。しかし、問題が 1 つあります。fitparameters の誤差を計算するためにも使用するように、leastsq に指示するにはどうすればよいですか? 私はcurve_fitを見ましたが、私の場合には絶対に設計されていないようです。入力として x を与えることができる関数が必要なようです。しかし、私の畳み込みでは、x 値を y 値に単純に変換することはできません。

それで、leastsq、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 の機能に触発されて書いた短い関数です。エラー関数の入力として彼女に 2D 配列を与えることができますが、そうする必要はありません。エラー関数は (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 に答える