Quelles sont les façons recommandées de faire des moindres carrés non linéaires, min , avec des contraintes de boîte ? Il me semble (les imbéciles se précipitent) que l'on pourrait rendre les contraintes de boîte quadratiques, et minimiser où est la "fonction tub" en forme de \ _ _ _ /, . Est-ce que cela fonctionne en théorie, fonctionne en pratique? (Il semble y avoir de nombreux articles théoriques sur NLS +, mais mon intérêt est pratique - des cas de test réels ou réalistes m'aideraient à choisir parmi les méthodes.) l o j < = p j < = h i j ∑ i e r r i ( p ) 2 + C ∗ ∑ j t u b ( p j , l o j , h i j ) 2 t u b ( x , l o ,
(Experts, veuillez ajouter des balises: "moindres carrés"?)
optimization
constraints
denis
la source
la source
Réponses:
L'ajout de termes de pénalité au carré pour se débarrasser des contraintes est une approche simple donnant une précision d'ordre 1 / facteur de pénalité uniquement. Par conséquent, il n'est pas recommandé pour une grande précision, sauf si vous laissez la pénalité aller à l'infini pendant le calcul. Mais un facteur de pénalité élevé rend la Hesse très mal conditionnée, ce qui limite la précision totale réalisable sans tenir compte explicitement des contraintes.
Notez que les contraintes liées sont beaucoup plus faciles à gérer que les contraintes générales, d'où elles ne sont pratiquement jamais converties en pénalités.
Le solveur L-BFGS-B (utilisé avec une histoire d'environ 5 dimensions) résout généralement les problèmes liés liés de manière très fiable et rapide dans les deux faibles dimensions élevées. Les exceptions sont la mauvaise convergence sur des problèmes qui peuvent devenir très plats loin des solutions, où il est facile de rester bloqué avec une méthode de descente.
Nous avons fait beaucoup d'expériences sur des fonctions très diverses dans de nombreuses dimensions différentes, avec de nombreux solveurs différents disponibles, car nous avions besoin d'un solveur contraint lié très robuste dans le cadre de notre logiciel d'optimisation globale. Le L-BFGS-B se démarque clairement comme une méthode à usage général, bien que, bien sûr, sur les problèmes de PME, les autres solveurs fonctionnent beaucoup mieux. Je recommanderais donc L-BFGS-B comme premier choix et j'essaierais des techniques alternatives au cas où L-BFGS-B traiterait mal votre classe particulière de problèmes.
la source
J'utiliserais simplement le solveur polyvalent IPOPT . C'est le solveur le plus robuste parmi ceux que j'ai essayés.
Sauf si vous avez des exigences très particulières, il n'y a aucune raison pour que vous insistiez sur un solveur spécifique au problème qui ne fonctionne que pour NLS avec des contraintes de boîte.
Une modification des exigences (par exemple, l'ajout de contraintes non linéaires) entraînerait un casse-tête majeur avec un résolveur spécifique au problème. Vous n'aurez pas de tels problèmes si vous utilisez l'IPOPT à usage général.
MISE À JOUR: Vous pouvez essayer L-BFGS avec IPOPT , voir sous Quasi-Newton dans la documentation.
La procédure de solution peut devenir plus rapide au prix de gâcher la remarquable robustesse d'IPOPT. À mon avis , utilisez les dérivés exacts s'ils sont disponibles. Je commencerais à jouer avec des approximations (telles que L-BFGS) uniquement si j'avais des problèmes de performances éprouvés.
la source
Le package CRAN R minpack.lm fournit une implémentation de Levenberg-Marquardt avec des contraintes de boîte.
En général, Levenberg-Marquardt est beaucoup mieux adapté que L-BFGS-B pour les problèmes de moindres carrés. Il convergera (beaucoup) mieux sur des problèmes difficiles. Il sera également beaucoup plus rapide que l'IPOPT à usage général, car il est adapté aux problèmes de moindres carrés non linéaires.
Le package R choisit une approche de projection très simple pour appliquer les contraintes (voir le code source ). Selon l'implémentation LM que vous utilisez, il peut être simple à inclure.
Maintenant, la suggestion dans les commentaires d'utiliser une transformation, (par exemple une transformation sinus comme dans scipy) est également une bonne alternative simple pour transformer votre algorithme LM non contraint en un algorithme contraint. Vous devrez également inclure la transformation dans le jacobien si le jacobien est analytique.
la source
(Des années plus tard) deux solveurs qui gèrent les contraintes de boîte:
Scipy less_squares a 3 méthodes, avec une documentation complète:
la source