Взвешенное по ошибкам приближение с использованием неопределенностей в 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,

Другие вопросы по тегам