Lmfit给出-1相关性和大不确定性(python)

时间:2018-03-07 14:22:48

标签: python correlation convolution lmfit uncertainty

我正在尝试使用lmfit模块将模型函数拟合到曲线。

我拟合的曲线设置如下:

e(x)= exp( - (x-X)/ x0)x大于或等于X,否则为0。

G(x)=(1 / sqrt(2 * pi)* sigma)* exp(-x ^ 2/2 * sigma ^ 2)

模型拟合M(x)= E * conv(e,G)(x)+ B

其中e是截断指数,G是高斯,E和B是常数。 e和G之间的运算符是卷积。

当我尝试将此功能应用于我的数据时,我感觉很合适。但是,拟合对我为X提供的初始值非常敏感。这也反映在参数的不确定性中:

[[Model]]
    ((Model(totemiss) * (Model(exptruncated) <function convolve at 0x7f139e2dcde8> Model(gaussian))) + Model(background))
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 67
    # data points      = 54
    # variables        = 5
    chi-square         = 120558969110355112544642583094864038386991104.00000
    reduced chi-square = 2460387124701124853181382654239391973638144.00000
    Akaike info crit   = 5275.63336
    Bayesian info crit = 5285.57828
[[Variables]]
    E:           9.7316e+28 +/- 2.41e+33 (2475007.74%) (init= 1.2e+29)
    x0:          5.9420e+06 +/- 9.52e+04 (1.60%) (init= 5000000)
    X:           4.9049e+05 +/- 1.47e+11 (29978575.17%) (init= 100000)
    sigma:       2.6258e+06 +/- 5.74e+04 (2.19%) (init= 2000000)
    center:      0 (fixed)
    amplitude:   1 (fixed)
    B:           3.9017e+22 +/- 3.75e+20 (0.96%) (init= 4.5e+22)
[[Correlations]] (unreported correlations are <  0.100)
    C(E, X)                      = -1.000
    C(sigma, B)                  = -0.429
    C(x0, sigma)                 = -0.283
    C(x0, B)                     = -0.266
    C(E, x0)                     = -0.105
    C(x0, X)                     =  0.105

我怀疑这是有事要做的,因为E和X之间的相关性为-1.00,这没有任何意义。我试图找出为什么我得到这个错误,我相信它可能在模型的定义中:

    def exptruncated(x, x0, X):
        return np.exp(-(x-X)/x0)* (x > X)

        #Define convolution operator
    def convolve(arr, kernel):
        npts = min(len(arr), len(kernel))
        pad  = np.ones(npts)
        tmp  = np.concatenate((pad*arr[0], arr, pad*arr[-1]))
        out  = np.convolve(tmp, kernel, mode='valid')
        noff = int((len(out) - npts)/2)
        return out[noff:noff+npts]

       #Constant value for total emissions#
    def totemiss(x,E):
        return E

       #Constant value for background value
    def background(x,B):
        return B

        # create Composite Model using the custom convolution operator
        # M(x) = E + conv(exp,gauss) + B

    mod  = Model(totemiss)* CompositeModel(Model(exptruncated), Model(gaussian), convolve) + Model(background)
    mod.set_param_hint('x0',value=50*1e5,min=0,max=60*1e5)
    mod.set_param_hint('amplitude',value=1.0)
    mod.set_param_hint('center',value=0.0)
    mod.set_param_hint('sigma',value=20*1e5,min=0,max=100*1e5)
    mod.set_param_hint('X',value=1.0*1e5,min=0, max=5.0*1e5)
    mod.set_param_hint('B',value=0.45*1e23,min=0.3*1e23,max=1.0*1e23)
    mod.set_param_hint('E',value=1.2*1e29,min=1.2*1e26,max=1.0*1e32)


    pars = mod.make_params()

    pars['amplitude'].vary = False
    pars['center'].vary = False
    result =  mod.fit(y, params=pars, x=x)

    comps = result.eval_components(x=x)

虽然我认为该模型是我无法找到错误来源的原因。也许你们中的某些人可以帮助我!

1 个答案:

答案 0 :(得分:0)

为什么不从模型中删除E - X参数用作常量偏移量。

我还建议让参数更合理地缩放,接近统一的顺序(比如大约1e-6到1e6)。您可以在模型计算中根据需要添加1e10等级,但它通常有助于协方差的计算(用于确定如何更新拟合中的值)以使参数更均匀地缩放。