首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lmfit中的标度误差与信息环境

lmfit中的标度误差与信息环境
EN

Stack Overflow用户
提问于 2021-06-11 12:00:53
回答 1查看 189关注 0票数 0

我用lmfit来解决一个非线性优化问题。它工作得很好,我试图实现一个测量误差作为因变量y (sigma_y)的标准偏差。我的问题是,我不能正确地解释信息标准。在实现return (model - y)/(sigma_y)时,它们只是从非常低的值提高到非常高的值。

即左:return (model - y) -加权->右:return (model - y)/(sigma_y)

我的猜测是,这在某种程度上与lmfit (信息标准的错误计算,错误缩放)的用法不佳有关,或者与对这些标准缺乏理解有关(在我看来,这些标准被缩减为5.258 (估计偏低)或1.776e-4 (高估),听起来很不合适,但残差等的情节对我来说似乎还可以.)

下面是再现问题的示例代码:

代码语言:javascript
复制
import lmfit
import numpy as np
import matplotlib.pyplot as plt

y = np.array([1.42774324, 1.45919099, 1.58891696, 1.78432768, 1.97403125,
       2.17091161, 2.02065766, 1.83449279, 1.64412613, 1.47265405,
       1.4507    ])
sigma_y = np.array([0.00312633, 0.00391546, 0.00873894, 0.01252675, 0.00639111,
       0.00452488, 0.0050566 , 0.01127185, 0.01081748, 0.00227587,
       0.00190191])
x = np.array([0.02372331, 0.07251188, 0.50685822, 1.30761963, 2.10535442,
       2.90597497, 2.30733552, 1.50906939, 0.7098041 , 0.09580686,
       0.04777082])
offset = np.array([1.18151707, 1.1815602 , 1.18202847, 1.18187962, 1.18047493,
       1.17903493, 1.17962602, 1.18141625, 1.18216907, 1.18222051,
       1.18238949])
parameter = lmfit.Parameters()
parameter.add('par_1', value = 1e-5)
parameter.add('par_2', value = 0.18)

def U_reg(parameter, x, offset):
    par_1 = parameter['par_1']
    par_2 = parameter['par_2']
    model = offset + 0.03043211217 * np.arcsinh(x / (2 * par_1)) + par_2 * x
    return (model - y)/(sigma_y)

mini = lmfit.Minimizer(U_reg, parameter, fcn_args=(x, offset), nan_policy='omit', scale_covar=False)
regr1 = mini.minimize(method='least_sq') #Levenberg-Marquardt
print("Levenberg-Marquardt:")
print(lmfit.fit_report(regr1, min_correl=0.9))

def U_plot(parameter, x, offset):
    par_1 = parameter['par_1']
    par_2 = parameter['par_2']
    model = offset + 0.03043211217 * np.arcsinh(x / (2 * par_1)) + par_2 * x
    return model - y

plt.title("Model vs Data")
plt.plot(x, y, 'b')
plt.plot(x, U_plot(regr1.params, x, offset) + y, 'r--', label='Levenberg-Marquardt')
plt.ylabel("y")
plt.xlabel("x")
plt.legend(loc='best')
plt.show()

我知道通过lmfit.Model实现加权可能更方便,因为有多个回归者,所以我想保留lmfit.Minimizer方法。我的python版本是3.8.5,lmfit是1.0.2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-12 02:48:32

好的,为了使卡方的大小有意义(例如,它在附近(N_data - N_varys) ),不确定性的尺度必须是正确的--给出每个观测的1西格玛标准差。

对于lmfit来说,检测您使用的西格玛是否具有正确的比例是不可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67936669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档