Я пытаюсь свести к минимуму следующую функцию выборки:
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
Нормальным способом минимизации такой функции может быть алгоритм Левенберга-Марквардта. Я хотел бы выполнить эту минимизацию в С++ и сделал некоторые начальные тесты с Eigen, что привело к ожидаемому решению.
Мой вопрос следующий:
Я использую для оптимизации в python, используя i.e. 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
и начать оптимизацию. При необходимости я могу изменить
параметры оптимизации.
Теперь алгоритм Eigen Lev-Marq работает по-другому. Мне нужно определить функцию
vector (почему?) Кроме того, мне не удается установить параметры оптимизации.
Согласно:
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.html
Я должен иметь возможность использовать setEpsilon()
и другие функции set.
Но когда у меня есть следующий код:
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$Eigen_demo$en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.php -
Как установить параметры оптимизации с помощью заданных функций?