Stoppkriterium für Nelder Mead

11

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 )f(xN+1)f(x1)<ϵϵxiif(x1)f(xN+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.

    f(x)=x2
    x1=1x2=1
  • 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.|f(x1)f(xc)|<ϵ

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.

JAD
quelle
1. Mir ist nicht klar, warum Sie vergleichen, was bei mit x 1 passiert . sicherlich möchten Sie es mit dem vergleichen, was bei x N passiert . 2. Konvergenzprüfungen sind ein besonders schwieriger Bereich bei vielen Optimierungen. Sie brauchen, dass sich die Funktion nicht viel ändert, aber wenn sich die Argumente schnell ändern (auch wenn sich die Funktion kaum ändert), haben Sie möglicherweise nicht konvergiert, sodass die Leute häufig Kriterien verwenden, die beide betrachten. Es gibt auch die Frage, ob Sie ein relatives oder ein absolutes Kriterium verwenden (beides reicht nicht aus - z. B. wird ein relativer Test, wenn Sie sehr nahe bei 0 sind, nicht ausgelöst)xN+1x1xN
Glen_b
3
Das beste Stoppkriterium für Nelder Mead ist, bevor Sie beginnen.
Mark L. Stone
Nur um Verwirrung in der Notation in @ Glen_bs Kommentar zu vermeiden ... Ich glaube, die Indizes hier beziehen sich auf die Eckpunkte des Simplex, nicht auf die Iteration des Algorithmus. Damit das erste in dieser Frage vorgeschlagene Konvergenzkriterium die niedrigsten und höchsten Funktionswerte von Eckpunkten im dimensionalen Parameterraum vergleicht ... wird dies in der Frage nicht explizit angegeben, sondern in der Beschreibung des Algorithmus auf der verknüpften Wikipedia-Seite ( und im Originalpapier) ordnen Sie die N + 1- Eckpunkte vom niedrigsten zum höchsten Funktionswert. NN+1
Nate Pope
@NatePope Das war meine Absicht, ja, ich werde die Frage klarer stellen. \
JAD

Antworten:

6

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:

NN

N+1P0

(10.4.1)Pi=P0+λei
eiNλ

Bei den meisten Schritten wird nur der Punkt des Simplex, an dem die Funktion am größten ist ("höchster Punkt"), durch die gegenüberliegende Seite des Simplex zu einem niedrigeren Punkt verschoben. ...

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:

Kündigungskriterien können heikel sein .... Wir können normalerweise einen "Zyklus" oder "Schritt" unseres mehrdimensionalen Algorithmus identifizieren. Es ist dann möglich zu beenden, wenn die in diesem Schritt bewegte Vektorentfernung geringfügig kleiner als eine Toleranz ist TOL. Alternativ könnten wir verlangen, dass die Abnahme des Funktionswerts im Abschlussschritt geringfügig kleiner als eine Toleranz ist FTOL. ...

NN+1(10.4.1)P0

Neustarts sollten niemals sehr teuer sein. Ihr Algorithmus ist schließlich einmal zum Neustartpunkt konvergiert, und jetzt starten Sie den Algorithmus bereits dort.

[Seiten 290-292.]

xyT>0

(1)|x||y|f(x,y)=2|x||y||x|+|y|<T

f(x,y)=(|x|+|y|)/2

(1)

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.

whuber
quelle
1
Vielen Dank für den Einblick in den Neustart. Ich dachte, dies würde den Algorithmus nur von verschiedenen Startpunkten aus ausführen, aber es scheint tatsächlich mehr zu geben.
JAD
Ich hatte vorher nicht über die möglichen Bedeutungen von "Neustart" nachgedacht. Im vorliegenden Kontext hätte ich vielleicht einen Begriff wie "Polieren" für den "Neustart" verwendet, aber vielleicht ist das auch nicht ganz richtig. Die Art des "Neustarts", die für die Simplex-Methode empfohlen wird, kann für sie etwas Besonderes sein.
whuber
9

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:

test=[(i=1n+1[S(bi)S¯]2)/n]1/2
S¯=i=1n+1S(bi)/(n+1).

S(.)bn+1nbHbL

S(bL)S(bH)

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;Wo VHist der hohe Wert und VLder 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:

(n+1)(n1)n

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.

Nate Papst
quelle
3

fmin(t)minall corners f(Xi,t)
# stop when you run out of patience, no improvement for say 10 iterations in a row:
if t > tbest + patience:
    message = "iter %d: f %g >= fbest %g" ...
    return message, fbest, xbest

n+1

  1. Das Problem: unwegsames Gelände, möglicherweise mit schlechter Skalierung oder dummen Einschränkungen
  2. der Algorithmus, der das Erkunden und Bewegen (und die Komplexität der Software) in Einklang bringt
  3. die eigentliche Stoppregel

bleibt abzuwarten - echte Testfälle sind willkommen.

(Eine echte StopiterKlasse hat zusätzlich viele Stoppbedingungen patience; 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 mitmin_improvement

denis
quelle