#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))
}