ceres solver ceres solver (http://ceres-solver.org/) est un solveur non linéaire des moindres carrés publié par google. Il semble être nommé d'après la planète ceres a été découverte par la méthode des moindres carrés.
Je laisserai l'explication détaillée à d'autres.La méthode du carré minimum est le problème de trouver $ x \ in \ Re ^ n $ qui minimise l'expression exprimée par la somme des carrés comme suit.
Minimize:
Par exemple, si $ x = [a, b]; a, b \ in \ Re $, $ f_i (a, b) = y_i- (at_i + b) $
Minimize:
Il devient. C'est le problème de trouver la droite $ y = ax + b $ qui correspond le mieux à $ (t_i, y_i) $. Cet exemple est une méthode de carré minimum linéaire, mais ceres est un solveur qui peut gérer ce $ f_i (x) $ même avec une fonction non linéaire.
Ceres est un solveur spécialisé dans la résolution de la méthode des moindres carrés. Il est possible de donner une borne supérieure et une borne inférieure à chaque variable, mais il n'est pas possible de donner plus de conditions de contrainte (contrainte d'égalité, contrainte d'inégalité, etc.). S'il est nécessaire de donner des contraintes, il faut utiliser un solveur capable de résoudre des problèmes de planification secondaires (ou relaxation de Lagrange). Bien entendu, l'optimisation globale n'est pas garantie pour les problèmes non convexes, mais il est possible de trouver des solutions (locales). Il est également possible de donner une valeur initiale arbitraire.
Eh bien, je parle de vouloir l'utiliser à partir de python, qui est le sujet principal, mais y a-t-il un meilleur moyen? Ceci est un article. Parce que ** je n'ai pas trouvé de bibliothèque de wrapper que je pourrais utiliser. ** (Il semble qu'il y en a qui sont publiés sur Cython, mais je n'avais aucune expérience avec la bibliothèque inconnue et Cython) Voici donc une introduction à la méthode que j'utilise pour le moment. ** S'il vous plaît laissez-moi savoir s'il existe une meilleure façon. ** **
** Ma solution est d'utiliser Boost.numpy. ** ** J'ai honte de dire que je n'ai pas fait grand chose en C ++, donc je n'ai entendu que le nom, mais Boost semble être une collection de diverses bibliothèques. Je crois comprendre que Boost.python est une bibliothèque wrapper pour appeler des fonctions et des classes C ++ à partir de python, et Boost.numpy est une bibliothèque wrapper qui vous permet de transmettre le ndarray et la matrice de numpy aux fonctions C ++. Pour être honnête, si vous connaissez l'existence de cette bibliothèque, le reste est facile. Puisque le code natif (?) Peut être écrit dans la partie C ++, le coût d'apprentissage est presque nul. Je dois écrire à la fois du code C et du code python, il est donc peu probable que je puisse utiliser ceres de python ...
Je définis moi-même la partie d'optimisation minimale avec les fonctions C et implémente le reste avec python. Personnellement, je suis satisfait de la méthode d'implémentation actuelle pour le moment, elle est très large car elle peut fondamentalement appeler n'importe quelle fonction de C ++ (bien qu'il semble que les classes etc. puissent être enveloppées dans la bibliothèque) ainsi que ceres. Je pense que cela s'est répandu.
Pour Boost.numpy, j'ai fait référence à ce qui suit. Il y avait aussi un exemple de CMakeLists, qui était très utile.
Le tutoriel seul est assez facile à comprendre sur Ceres.
Recommended Posts