Criterio di arresto per Nelder Mead


11

Sto cercando di implementare l'algoritmo Nelder-Mead per ottimizzare una funzione. La pagina di Wikipedia su Nelder-Mead è sorprendentemente chiara sull'intero algoritmo, ad eccezione del suo criterio di arresto. Lì dice tristemente:

Verificare la convergenza [chiarimento necessario] .

Ho provato e testato un paio di criteri me stesso:

  • Fermati se dove è piccolo e dove è l' -vertice del simplex, ordinato dal basso ( ) all'alto ( ) valori della funzione. In altre parole, quando il valore massimo del simplex è quasi uguale al valore minimo. Ho scoperto che questo non ha funzionato correttamente, dal momento che questo non fornisce garanzie su ciò che la funzione fa all'interno del simplex. Esempio, considera la funzione: Questo è ovviamente banale da ottimizzare, ma diciamo che lo facciamo con NM, e lascia che i nostri due punti simplex siano eϵ x i i f ( x 1 ) f ( x N + 1 ) f ( x ) = x 2 x 1 = - 1 x 2 = 1f(xN+1)f(x1)<εεXioiof(X1)f(XN+1)

    f(X)=X2
    X1=-1X2=1. L'algoritmo converrebbe qui senza trovare il suo ottimale.
  • La seconda opzione prevede la valutazione del centroide del simplex: stop if . Ciò presuppone che se il punto più basso del simplex e del centroide hanno valori simili, il simplex è sufficientemente piccolo da chiamare convergenza.|f(X1)-f(Xc)|<ε

È questo un modo corretto per verificare la convergenza? O esiste un modo stabilito per verificarlo? Non ho trovato alcuna fonte su questo, dal momento che la maggior parte dei risultati della ricerca si concentra sulla complessità dell'algoritmo.


1. Non mi è chiaro perché stai confrontando ciò che accade in con x 1 ; sicuramente ci si vuole confrontare con ciò che accade a x N . 2. i controlli di convergenza sono un'area particolarmente delicata in termini di ottimizzazione; hai bisogno che la funzione non cambi molto, ma se gli argomenti cambiano rapidamente (anche se la funzione sta cambiando a malapena) potresti non essere convergente, quindi le persone spesso usano criteri che guardano entrambi. C'è anche il problema se usi un parente o un criterio assoluto (nessuno dei due è sufficiente, ad esempio un test relativo quando sei molto vicino a 0 non verrà attivato)XN+1X1XN
Glen_b -Reinstate Monica

3
Il miglior criterio di arresto per Nelder Mead è prima di iniziare.
Mark L. Stone,

Giusto per evitare confusione e notazione nel commento di @ Glen_b ... Credo che i pedici qui si riferiscano ai vertici del simplex, non all'iterazione dell'algoritmo. In modo che il primo criterio di convergenza proposto in questa domanda, confronta i valori di funzione più bassi e più alti dei vertici nello spazio dei parametri dimensionale ... non è esplicitamente indicato nella domanda, ma la descrizione dell'algoritmo sulla pagina di Wikipedia collegata ( e nella carta originale) ordina i vertici N + 1 dal valore della funzione più basso al più alto. NN+1
Nate Pope,

@NatePope Quella era la mia intenzione sì, aggiungerò chiarimenti alla domanda. \
JAD,

Risposte:


6

Il resoconto di questo "algoritmo downhill simplex" nelle versioni originali di Ricette numeriche è particolarmente lucido e utile. Ne citerò quindi parti pertinenti. Ecco lo sfondo:

Nella minimizzazione unidimensionale, è stato possibile racchiudere un minimo ... Ahimè! Non esiste una procedura analoga nello spazio multidimensionale. ... Il meglio che possiamo fare è dare un'ipotesi iniziale al nostro algoritmo; vale a dire un vettore di variabili indipendenti come primo punto da provare. L'algoritmo dovrebbe quindi farsi strada in discesa attraverso la complessità inimmaginabile di una topografia N- dimensionale fino a quando non incontra un minimo (almeno locale).NN

Il metodo downhill simplex deve essere avviato non solo con un singolo punto, ma con punti, definendo un simplex iniziale. [Puoi considerare questi punti come un punto iniziale iniziale P 0 insieme a] P i = P 0 + λ e i dove e i sono N vettori di unità e dove λ è una costante che è la tua ipotesi della caratteristica del problema scala di lunghezza. ...N+1P0

(10.4.1)Pio=P0+λeio
eioNλ

La maggior parte dei passi semplicemente [sposta] il punto del simplex in cui la funzione è maggiore ("punto più alto") attraverso la faccia opposta del simplex verso un punto inferiore. ...

Ora per il problema in corso, terminando l'algoritmo. Nota la generalità dell'account: gli autori forniscono consigli intuitivi e utili per terminare qualsiasi ottimizzatore multidimensionale e quindi mostrano specificamente come si applica a questo particolare algoritmo. Il primo paragrafo risponde alla domanda che abbiamo di fronte:

I criteri di risoluzione possono essere delicati ... In genere siamo in grado di identificare un "ciclo" o "passaggio" del nostro algoritmo multidimensionale. È quindi possibile terminare quando la distanza del vettore spostata in quel passaggio è di entità leggermente inferiore rispetto a una certa tolleranza TOL. In alternativa, potremmo richiedere che la diminuzione del valore della funzione nella fase finale sia leggermente più piccola di una certa tolleranza FTOL. ...

NN+1(10.4.1)P0

I riavvii non dovrebbero mai essere molto costosi; il tuo algoritmo, dopo tutto, è converto al punto di riavvio una volta, e ora stai iniziando l'algoritmo già lì.

[Pagine 290-292.]

XyT>0

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

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

(1)

Riferimento

William H. Press et al. , Ricette numeriche: l'arte del calcolo scientifico. Cambridge University Press (1986). Visita http://numerical.recipes/ per le ultime edizioni.


1
Grazie per le informazioni sul riavvio. Pensavo che questo stesse eseguendo l'algoritmo da diversi punti di partenza, ma in realtà sembra esserci di più.
JAD

Non avevo mai pensato ai possibili significati di "riavvio". Nel contesto attuale, avrei potuto usare un termine come "lucidare" per "riavviare", ma forse non è nemmeno del tutto giusto. Il tipo di "riavvio" richiesto per il metodo simplex può essere piuttosto speciale.
whuber

9

Non una risposta completa, ma troppo lunga per un commento e potrebbe metterti sulla buona strada.

Questo argomento è brevemente trattato a pagina 171 di "Metodi numerici compatti per computer" 2a edizione, di John C. Nash. E sembra essere il riferimento citato per la routine Nelder-Mead implementata nella optim()funzione di R. Citando la parte rilevante:

teSt=[(Σio=1n+1[S(Bio)-S¯]2)/n]1/2
S¯=Σio=1n+1S(Bio)/(n+1).

S(.)Bn+1nBHBL

S(BL)S(BH)

Una rapida occhiata alla fonte optim()indica che utilizza la differenza tra i valori di funzione più alto e più basso (dei punti che definiscono il simplex) per determinare la convergenza: if (VH <= VL + convtol || VL <= abstol) break;dove si VHtrovano il valore alto e VLil valore basso. Questo viene fornito con l'avvertenza che ho dato una rapida occhiata alla fonte e probabilmente mi manca qualcosa.

Ora, l'opzione (1) sembra essere il secondo approccio sostenuto da Nash. Discute anche del problema riscontrato:

(n+1)(n-1)n

I riferimenti originali a cui Nash fa riferimento qui sono:

Nelder JA, Mead R. 1965. Un metodo simplex per minimizzare le funzioni. The Computer Journal 7: 308-313.

O'Neill R. 1971. Algoritmo AS 47: minimizzazione delle funzioni usando una procedura simplex. Statistica applicata 20: 338-345.


3

fmin(t)mintutti gli angoli f(Xio,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. il problema: terreno accidentato, forse con cattivo ridimensionamento o vincoli sciocchi
  2. l'algoritmo, bilanciamento tra esplorazione e spostamento (e complessità del software)
  3. la regola di arresto corretta

resta da vedere - i veri casi di test sono benvenuti.

(Una vera Stopiterclasse ha molte condizioni di arresto, oltre a patience; il più semplice è il tempo dell'orologio a muro.)

Vedi anche:
NLopt : molti algoritmi tra cui Nelder-Mead, facili da confrontare. Vedi in particolare le note sul Confronto degli algoritmi in
discesa : fermare la pazienzamin_improvement

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.