Ich versuche, den Nelder-Mead-Algorithmus zur Optimierung einer Funktion zu implementieren. Die Wikipedia-Seite über Nelder-Mead ist überraschend klar über den gesamten Algorithmus, mit Ausnahme seines Stoppkriteriums. Dort heißt es leider:
Auf Konvergenz prüfen [Klarstellung erforderlich] .
Ich habe selbst einige Kriterien ausprobiert und getestet:
Stoppen Sie, wenn wobei ϵ klein ist und x i der i- te Scheitelpunkt des Simplex ist, geordnet von niedrig ( f ( x 1 ) ) bis hoch ( f () x N + 1 )) Funktionswerte. Mit anderen Worten, wenn der Maximalwert des Simplex fast gleich dem Minimalwert ist. Ich fand, dass dies nicht richtig funktionierte, da dies keine Garantie dafür gibt, was die Funktion im Simplex tut. Betrachten Sie beispielsweise die Funktion: Dies ist natürlich trivial zu optimieren, aber nehmen wir an, wir machen dies mit NM und lassen unsere beiden Simplex-Punkte x 1 = - 1 und x 2 = 1 sein . Der Algorithmus würde hier konvergieren, ohne sein Optimum zu finden.
Die zweite Option beinhaltet die Auswertung des Schwerpunkts des Simplex: stop if . Dies setzt voraus, dass, wenn der niedrigste Punkt des Simplex und der Schwerpunkt solche ähnlichen Werte haben, der Simplex ausreichend klein ist, um Konvergenz zu nennen.
Ist dies ein geeigneter Weg, um die Konvergenz zu überprüfen? Oder gibt es eine etablierte Möglichkeit, dies zu überprüfen? Ich konnte hierzu keine Quellen finden, da sich die meisten Suchtreffer auf die Komplexität des Algorithmus konzentrieren.
Antworten:
Die Darstellung dieses "Downhill-Simplex-Algorithmus" in den Originalversionen von Numerical Recipes ist besonders klar und hilfreich. Ich werde daher relevante Teile davon zitieren. Hier ist der Hintergrund:
Nun zum vorliegenden Problem: Beenden des Algorithmus. Beachten Sie die Allgemeingültigkeit des Kontos: Die Autoren geben intuitive und nützliche Ratschläge zum Beenden eines mehrdimensionalen Optimierers und zeigen dann speziell, wie er für diesen bestimmten Algorithmus gilt. Der erste Absatz beantwortet die vor uns liegende Frage:
[Seiten 290-292.]
Referenz
William H. Press et al. , Numerische Rezepte: Die Kunst des wissenschaftlichen Rechnens. Cambridge University Press (1986). Besuchen Sie http://numerical.recipes/ für die neuesten Ausgaben.
quelle
Keine vollständige Antwort, aber zu lang für einen Kommentar und könnte Sie auf den richtigen Weg bringen.
Dieses Thema wird auf Seite 171 der 2. Ausgabe von "Compact Numerical Methods for Computers" von John C. Nash kurz behandelt. Und ist zufällig die Referenz, die für die in Rs
optim()
Funktion implementierte Nelder-Mead-Routine zitiert wird . Zitieren des relevanten Teils:Ein kurzer Blick auf die Quelle von
optim()
zeigt an, dass die Differenz zwischen dem höchsten und dem niedrigsten Funktionswert (der Punkte, die den Simplex definieren) verwendet wird, um die Konvergenz zu bestimmen:if (VH <= VL + convtol || VL <= abstol) break;
WoVH
ist der hohe Wert undVL
der niedrige Wert? Dies ist mit der Einschränkung verbunden, dass ich mir die Quelle sehr schnell angesehen habe und wahrscheinlich etwas fehlt.Nun scheint Ihre Option (1) der zweite von Nash befürwortete Ansatz zu sein. Er bespricht auch das Problem, auf das Sie gestoßen sind:
Die ursprünglichen Referenzen, auf die sich Nash hier bezieht, sind:
Nelder JA, Mead R. 1965. Eine Simplex-Methode zur Funktionsminimierung. The Computer Journal 7: 308-313.
O'Neill R. 1971. Algorithmus AS 47: Funktionsminimierung unter Verwendung eines Simplex-Verfahrens. Applied Statistics 20: 338 & ndash; 345.
quelle
bleibt abzuwarten - echte Testfälle sind willkommen.
(Eine echte
Stopiter
Klasse hat zusätzlich viele Stoppbedingungenpatience
; am einfachsten ist die Wanduhrzeit.)Siehe auch:
NLopt : Viele Algorithmen, einschließlich Nelder-Mead, leicht zu vergleichen. Siehe insbesondere die Hinweise zum Vergleichen von Algorithmen
Downhill : Geduld aufhören mit
min_improvement
quelle