0

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

我拟合的曲线设置如下:

对于 x 大于或等于 X,e(x) = exp(-(xX)/x0),否则为 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)

虽然我相信模型是我无法找到错误来自哪里的原因。也许你们中的某个人可以帮助我!

4

1 回答 1

0

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

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

于 2018-03-07T17:36:31.207 回答