Я пытаюсь минимизировать следующую примерную функцию:
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
Нормальным способом минимизации такой функции может быть алгоритм Левенберга-Марквардта. Я хотел бы выполнить эту минимизацию на С++ и провел несколько начальных тестов с Eigen, которые привели к ожидаемому решению.
Мой вопрос заключается в следующем: я привык к оптимизации в python, используя, например, scipy.optimize.fmin_powell
. Здесь входными параметрами функции являются (func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None)
. Итак, я могу определить func(x0)
, задать вектор x0
и начать оптимизацию. При необходимости я могу изменить параметры оптимизации.
Теперь алгоритм Эйгена Лева-Марка работает по-другому. Мне нужно определить вектор функции (почему?) Кроме того, я не могу установить параметры оптимизации. Согласно:
http://eigen.tuxfamily.org/dox/unsupported/classEigen
1LevenbergMarquardt .htmlF(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
Я должен иметь возможность использовать setEpsilon()
и другие функции множества.
Но когда у меня есть следующий код:
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.setEpsilon(); //doesn't exist!
Итак, у меня есть 2 вопроса:
Зачем нужен вектор функции и почему скалярной функции недостаточно?
Ссылки, где я искал ответ:
http://www.ultimatepp.org/reference%24Eigen_demo%24en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.phpКак установить параметры оптимизации с помощью установленных функций?