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



我正在尝试使用 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)

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

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

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

最新更新