staram się zminimalizować następującą funkcję próbkowania:Jak korzystać z niewspieranej implementacji levinbers marquardt?
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
normalny sposób, aby zminimalizować taką FUNCT może być algorytm Levenberg-Marquardt. Chciałbym wykonać tę minimalizację w C++ i zrobić kilka początkowych testów z Eigenem, które dały oczekiwane rozwiązanie.
Moje pytanie jest następujące: Jestem przyzwyczajony do optymalizacji w python za pomocą np. scipy.optimize.fmin_powell
. Tutaj parametrami funkcji wejściowej są (func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None)
. Więc mogę zdefiniować func(x0)
, dać wektor x0
i rozpocząć optymalizację. W razie potrzeby mogę zmienić parametry optymalizacji.
Teraz algorytm Levina-Marca działa w inny sposób. Muszę zdefiniować funkcję wektorową (dlaczego?) Ponadto nie mogę ustawić parametrów optymalizacji. Zgodnie z:
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.html Powinny być w stanie korzystać z setEpsilon()
i innych funkcji zestawu.
Ale kiedy mam następujący kod:
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.setEpsilon(); //doesn't exist!
Więc mam 2 pytania:
Dlaczego jest wektorem funkcji potrzebna i dlaczego nie skalar funkcja wystarczy?
Referencje gdzie Rozglądałem się na odpowiedź:
http://www.ultimatepp.org/reference$Eigen_demo$en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.phpJak ustawić parametry optymalizacji stosując zbiór funkcji?
I przetestowaniu przykładowego kodu ponieważ musiałem zrobić coś podobnego i zauważyłem, że zamiast sumowania 10 * pow (x (0) +3,2) + pow (x (1) -5, 2) w f (0) i ustawienie f (1) 0 umieścisz 10 * pow (x (0) +3,2) w f (0) i pow (x (1) -5, 2) w f (1) to zbiega się ALOT szybciej. W 30 powtórzeniach z rozróżnieniem terminów udało mi się osiągnąć 100 stopień dokładności, a przy sposobie, w jaki go wprowadziłeś, zajęło około 500. – coderdave
Prawda! Najprawdopodobniej jest to spowodowane NumericalDiff. Pytanie, które miałem, to to, czy w ogóle możliwe byłoby posiadanie tylko jednej funkcji skalar w ogóle lub jeśli zawsze jest potrzeba różnych wektorów funkcji. Pisząc to w ten sposób, mogę zdefiniować f (0) i ustawić f (1) na zero. Aby przyspieszyć, mogłem podzielić funkcję na f (0) i f (1) lub utworzyć df, aby funkcja NumericalDiff nie była już potrzebna. Ponadto przestałem używać tego algorytmu Lev-Marq i używam własnego, aby uzyskać lepszą wydajność w zakresie wektora funkcyjnego z ~ 1500 wpisami ... – Deepfreeze
Powyższy przykład kodu wydaje się pochodzić z tego przykładu [CurveFitting.cpp] (https://github.com/daviddoria/Examples/blob/master/c%2B%2B/Eigen/LevenbergMarquardt/CurveFitting.cpp). – nils