使用 LMFIT 中的不确定性进行误差加权拟合



我正在尝试使用 LMFIT 拟合模型,我可以轻松执行以下操作:

def loss_function(params):
residuals = []
for x, measured in ...:
y = predict(x, params)
residuals.append(y - measured)
return residuals
params = Parameters()
params.add(...)
model = Minimizer(loss_function, params)
result = model.minimize(method='leastsq')

并获得非常合理的结果

现在我也有一些与measured变量相关的不确定性(例如测量误差),所以我想用与之相关的标准误差来加权残差中的点(假设它始终是测量值的 20%)。代码现在变为如下所示:

def loss_function(params):
residuals = []
for x, measured in ...:
y = predict(x, params)
residuals.append((y - measured) / (measured * 0.2))
return residuals
params = Parameters()
params.add(...)
model = Minimizer(loss_function, params)
result = model.minimize(method='leastsq')

问题是现在我得到的拟合结果完全不可靠。为什么?我该如何解决这个问题?

"完全不可靠"的本质是什么? 您可能希望数据中的不确定性严格为正 - 使用measured* 0.2可能允许负值或零。 请注意,如果残差中有 NaN 或 Inf,则拟合将无法正常工作,并且几乎肯定会将参数值保留在其起始值。

FWIW,您可以使用fcn_args参数将参数传递给目标函数(用于测量、不确定性等)以Minimizer

最新更新