Границы параметров с использованием Левенберга-Марквардта Эйгена

#c #eigen #levenberg-marquardt

Вопрос:

Я использую реализацию Левенберга-Марквардта Эйгена и задаюсь вопросом, как установить некоторые границы параметров, которые следует оптимизировать.

Поскольку я переношу некоторые программы GNU octave в Eigen, я ожидал, что могут существовать некоторые границы, которые можно легко указать в качестве параметров модуля.

Схема моей реализации почти такая же, как в этом примере. Я не предоставляю реализацию df (), а скорее использую Eigen::NumericalDiff, чтобы приблизить ее.

Итак, как мне установить некоторые границы для параметров, которые предоставляются для минимизации()? Я думал о том, чтобы установить ошибки(fvec) в операторе() на некоторые высокие значения при выходе из ожидаемых диапазонов, но в некоторых небольших тестах это привело к странным результатам.

Ответ №1:

Я нашел решение, которое, по крайней мере, работает на меня.

Идея состоит в том, чтобы увеличить вектор ошибок, как только параметры выйдут за пределы своей разумности.

Это может быть достигнуто с помощью следующей функции:

 penalize(x1, x2) = 1   (exp(x1-x1max)*b1)   exp((x1min-x1)*b1)   exp((x2-x2max)*b2)   exp((x2min-x2)*b2)
 

в1/в2/… должно быть выбрано в зависимости от границ. В моем случае я начал с b1=0,1 для диапазона 1600…3200.
Функция может быть легко расширена до используемого количества параметров.

Используйте эту функцию следующим образом:

 int operator(x, fvec) const
{
    fvec(i) = ... * penalize(x(1), x(2))
}