ceres solver ceres solver (http://ceres-solver.org/) ist ein nichtlinearer Solver mit kleinsten Quadraten, der von Google veröffentlicht wird. Es scheint benannt zu sein, nachdem der Planet Ceres nach der Methode der kleinsten Quadrate entdeckt wurde.
Ich werde die detaillierte Erklärung anderen überlassen. Die Methode der minimalen Quadrate ist das Problem, $ x \ in \ Re ^ n $ zu finden, das den Ausdruck minimiert, der durch die Summe der Quadrate wie folgt ausgedrückt wird.
Minimize:
Wenn zum Beispiel $ x = [a, b]; a, b \ in \ Re $, $ f_i (a, b) = y_i- (at_i + b) $
Minimize:
Es wird. Dies ist das Problem, die gerade Linie $ y = ax + b $ zu finden, die am besten zu $ (t_i, y_i) $ passt. Dieses Beispiel ist eine lineare Minimum-Quadrat-Methode, aber ceres ist ein Löser, der dieses $ f_i (x) $ auch mit einer nichtlinearen Funktion verarbeiten kann.
Ceres ist ein Löser, der sich auf die Lösung der Methode der kleinsten Quadrate spezialisiert hat. Sie können jeder Variablen Ober- und Untergrenzen zuweisen, aber Sie können keine weiteren Einschränkungsbedingungen angeben (z. B. Gleichheitsbeschränkungen und Ungleichheitsbeschränkungen). Wenn Einschränkungen angegeben werden müssen, muss ein Löser verwendet werden, der sekundäre Planungsprobleme (oder Lagrange-Relaxation) lösen kann. Natürlich ist eine globale Optimierung für nicht konvexe Probleme nicht garantiert, aber es ist möglich, (lokale) Lösungen zu finden. Es ist auch möglich, einen beliebigen Anfangswert anzugeben.
Nun, ich spreche davon, es aus Python verwenden zu wollen, was das Hauptthema ist, aber gibt es einen besseren Weg? Dies ist ein Artikel. Weil ** ich keine Wrapper-Bibliothek finden konnte, die ich verwenden konnte. ** (Es scheint, dass es einige gibt, die auf Cython veröffentlicht werden, aber ich hatte keine Erfahrung mit der unbekannten Bibliothek & Cython) Das Folgende ist also eine Einführung in die Methode, die ich derzeit verwende. ** Bitte lassen Sie mich wissen, ob es einen besseren Weg gibt. ** ** **
** Meine Lösung ist die Verwendung von Boost.numpy. ** ** ** Ich schäme mich zu sagen, dass ich in C ++ nicht viel getan habe, also habe ich nur den Namen gehört, aber Boost scheint eine Sammlung verschiedener Bibliotheken zu sein. Ich verstehe, dass Boost.python eine Wrapper-Bibliothek zum Aufrufen von C ++ - Funktionen und -Klassen aus Python ist, und Boost.numpy ist eine Wrapper-Bibliothek, mit der Sie das ndarray und die Matrix von numpy an C ++ - Funktionen übergeben können. Um ehrlich zu sein, wenn Sie die Existenz dieser Bibliothek kennen, ist der Rest einfach. Da der native (?) Code im C ++ - Teil geschrieben werden kann, sind die Lernkosten nahezu Null. Ich muss sowohl C-Code als auch Python-Code schreiben, daher ist es zweifelhaft, dass ich Ceres aus Python verwenden kann ...
Ich selbst definiere den minimalen Optimierungsteil mit C-Funktionen und implementiere den Rest mit Python. Persönlich bin ich mit der aktuellen Implementierungsmethode vorerst zufrieden. Sie ist sehr umfangreich, da sie grundsätzlich jede Funktion von C ++ (obwohl es den Anschein hat, dass Klassen usw. in die Bibliothek eingeschlossen werden können) sowie ceres aufrufen kann. Ich denke, das hat sich ausgebreitet.
Für Boost.numpy habe ich Folgendes erwähnt. Es gab auch ein Beispiel für CMakeLists, das sehr hilfreich war.
Das Tutorial allein ist leicht genug, um Ceres zu verstehen.
Recommended Posts