J'essaie d'implémenter l'algorithme Nelder-Mead pour optimiser une fonction. La page wikipedia sur Nelder-Mead est étonnamment claire sur l'ensemble de l'algorithme, à l'exception de son critère d'arrêt. Là, il dit malheureusement:
Vérifier la convergence [clarification nécessaire] .
J'ai moi-même essayé et testé quelques critères:
Arrêtez si où ϵ est petit et où x i est le i- ème sommet du simplexe, ordonné de bas ( f ( x 1 ) ) à haut ( f ( x N + 1 )) valeurs de fonction. En d'autres termes, lorsque la valeur maximale du simplex est presque égale à la valeur minimale. J'ai trouvé que cela ne fonctionnait pas correctement, car cela ne donne aucune garantie sur ce que fait la fonction à l'intérieur du simplex. Exemple, considérons la fonction: Ceci est bien sûr trivial à optimiser, mais disons que nous le faisons avec NM, et que nos deux points simplex soient x 1 = - 1 et x 2 = 1 . L'algorithme convergerait ici sans trouver son optimum.
La deuxième option consiste à évaluer le centroïde du simplexe: arrêtez si . Cela suppose que si le point le plus bas du simplexe et du centroïde ont des valeurs similaires, le simplexe est suffisamment petit pour appeler la convergence.
Est-ce une bonne façon de vérifier la convergence? Ou existe-t-il un moyen établi de vérifier cela? Je n'ai trouvé aucune source à ce sujet, car la plupart des résultats de recherche se concentrent sur la complexité de l'algorithme.
Réponses:
Le récit de cet "algorithme du simplex de descente" dans les versions originales de Recettes numériques est particulièrement lucide et utile. J'en citerai donc les parties pertinentes. Voici le contexte:
Maintenant, pour le problème à résoudre, terminer l'algorithme. Notez la généralité du compte: les auteurs fournissent des conseils intuitifs et utiles pour terminer tout optimiseur multidimensionnel, puis montrent spécifiquement comment il s'applique à cet algorithme particulier. Le premier paragraphe répond à la question qui nous est posée:
[Pages 290-292.]
Référence
William H. Press et al. , Recettes numériques: L'art du calcul scientifique. Cambridge University Press (1986). Visitez http://numerical.recipes/ pour les dernières éditions.
la source
Pas une réponse complète, mais trop longue pour un commentaire et peut vous mettre sur la bonne voie.
Ce sujet est brièvement traité à la page 171 de "Compact Numerical Methods for Computers" 2nd Ed., Par John C. Nash. Et se trouve être la référence citée pour la routine Nelder-Mead implémentée dans la
optim()
fonction de R. Citant la partie pertinente:Un coup d'œil rapide à la source de
optim()
indique qu'il utilise la différence entre les valeurs de fonction les plus élevées et les plus basses (des points définissant le simplexe) pour déterminer la convergence:if (VH <= VL + convtol || VL <= abstol) break;
OùVH
est la valeur haute etVL
la valeur basse. Cela vient avec la mise en garde que j'ai jeté un coup d'œil à la source, et il me manque probablement quelque chose.Maintenant, votre option (1) semble être la deuxième approche préconisée par Nash. Il discute également du problème que vous avez rencontré:
Les références originales auxquelles Nash fait référence ici sont:
Nelder JA, Mead R. 1965. Une méthode simplex pour la minimisation des fonctions. The Computer Journal 7: 308-313.
O'Neill R. 1971. Algorithme AS 47: minimisation des fonctions à l'aide d'une procédure simplex. Statistiques appliquées 20: 338-345.
la source
reste à voir - de vrais cas de test sont les bienvenus.
(Une vraie
Stopiter
classe a de nombreuses conditions d'arrêt, en plus depatience
; l'horloge murale est la plus simple.)Voir aussi:
NLopt : de nombreux algorithmes dont Nelder-Mead, faciles à comparer. Voir en particulier les notes sur la comparaison des algorithmes de
descente : la patience s'arrête avec
min_improvement
la source