Взвешенное по ошибкам приближение с использованием неопределенностей в 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')
Проблема в том, что теперь я получаю совершенно ненадежные результаты. Зачем? Как я могу это исправить?
1 ответ
Какова природа "абсолютно ненадежных"? Вы, вероятно, хотели бы, чтобы неопределенности в данных были строго положительными - используя measured* 0.2
может разрешить отрицательные значения или нули. Обратите внимание, что если в остатке есть NaN или Infs, подбор будет работать не очень хорошо и почти наверняка оставит значения параметров в их начальных значениях.
FWIW, вы можете передавать аргументы целевой функции (для измерений, неопределенностей и т. Д.), Используя fcn_args
аргумент Minimizer
,