8

Szukam optymalizacji gradientu zejścia, aby zminimalizować koszt wystąpienia zmiennych. Mój program jest bardzo drogi pod względem obliczeniowym, dlatego szukam popularnej biblioteki z szybką implementacją GD. Jaka jest zalecana biblioteka/odniesienie?Szybka implementacja spadku gradientu w bibliotece C++?

+0

Jaki byłby _fast_? Nie dokładny? Buforowane odpowiedzi na poprzednie zapytania? Lub jakiś inny rodzaj kryteriów? – sarnold

+0

@arnarnold True. Nieścisłość jest w porządku, nie muszę uderzać w globalne optimum.Chcę tylko czegoś, co może szybko osiągnąć lepsze wyniki niż losowe wyszukiwanie :) Chciałbym zagrać z czasem, w którym pozwalam mu działać, aby zobaczyć czas/poprawę kompromisu. – Jim

+0

Dlaczego twoja implementacja jest wolna? – Jacob

Odpowiedz

9

GSL jest wielki (i za darmo) biblioteki, który już realizuje wspólne funkcje matematyczne i naukowe zainteresowania.

można czytać przez całą reference manual online. Kręcenie się, this zaczyna wyglądać interesująco, ale myślę, że powinniśmy wiedzieć więcej o problemie.

+1

Te alternatywne algorytmy wymienione w podręczniku GSL są metodami koniugatu/biconjugatu i powinny zapewniać lepszą wydajność niż pochodzenie gradientowe, o ile dane są "dobrze zachowane". –

+2

A jeśli obliczasz liczbowo swoje pochodne na podstawie wartości funkcji, prawdopodobnie będziesz potrzebować tego zamiast: http://www.gnu.org/software/gsl/manual/html_node/Multimin-Algorithms-without-Derivatives.html –

+0

To wygląda na naprawdę dobrą odpowiedź, ale bardzo trudno mi się z tym poradzić z VS2010 (wybredny, wiem ...) – Jim

2

Wypróbuj CPLEX, która jest dostępna bezpłatnie dla studentów.

4

Jeden z najlepszych cenionych bibliotek dla tego rodzaju pracy optymalizacji jest NAG libraries. Są one używane na całym świecie na uniwersytetach iw przemyśle. Są dostępne dla C/FORTRAN. Są bardzo niewolne i zawierają znacznie więcej niż tylko funkcje minimalizujące - omówiono wiele ogólnych zagadnień matematycznych.

W każdym razie podejrzewam, że ta biblioteka jest przesadna, jeśli chodzi o to, czego potrzebujesz. Ale tutaj są części odnoszące się do minimalizacji: Local Minimisation i Global Minimization.

+0

Ta biblioteka również wygląda naprawdę dobrze, ale "bardzo niewolna" część sprawia, że ​​jestem trochę nieufna w używaniu jej. – Jim

4

Wygląda na to, że jesteś całkiem nowy w metodach minimalizacji. Kiedykolwiek muszę nauczyć się nowego zestawu metod numerycznych, zwykle patrzę w Numerical Recipes. Jest to książka, która zapewnia dobry przegląd najczęstszych metod w tej dziedzinie, ich kompromisów i (co ważne) gdzie szukać w literaturze, aby uzyskać więcej informacji. Zazwyczaj nie jest to miejsce, w którym się zatrzymuję, ale często jest to przydatny punkt wyjścia.

Na przykład, jeśli funkcja ta jest kosztowna, a Twoim celem jest Minimalizacja liczby ocen potrzebować zbieżne. Jeśli masz wyrazy analityczne dla gradientu, to metoda oparta na gradiencie prawdopodobnie zadziała na twoją korzyść, zakładając, że funkcja i jej gradient są dobrze zachowane (brak osobliwości) w domenie będącej przedmiotem zainteresowania.

Jeśli nie masz gradientów analitycznych, to prawie zawsze lepiej jest stosować podejście takie jak downhill simplex, które ocenia tylko funkcję (nie jej gradienty). Gradienty liczbowe są drogie.

Należy również pamiętać, że wszystkie z tych metod będą zbliżać się do lokalnych minimów, więc są dość wrażliwe na punkcie, w którym uruchamiany jest optymalizator. Globalna optymalizacja to zupełnie inna bestia.

Jako ostateczna myśl, prawie cały kod, który można znaleźć w celu minimalizacji, będzie rozsądnie wydajny. Rzeczywisty koszt minimalizacji jest w funkcji kosztów. Powinieneś poświęcić czas na profilowanie i optymalizację swojej funkcji kosztowej i wybrać algorytm, który zminimalizuje liczbę razy, którą musisz nazwać (metody takie jak downhill simplex, gradient koniugacyjny i BFGS wszystkie świecą na różne rodzaje problemów).

Pod względem faktycznego kodu można znaleźć wiele ładnych procedur pod numerem NETLIB, oprócz innych wspomnianych bibliotek. Większość procedur jest w FORTRAN 77, ale nie wszystkie; aby przekonwertować je do C, f2c jest całkiem przydatne.

+1

Dodatkową informacją o używaniu funkcji Fortrana jest to, że zazwyczaj łatwo jest połączyć kod C i Fortran razem. Szczególnie dobrze zbudowane biblioteki fortranów. –