Algoritmo di Gauss-Newton

Da testwiki.
Vai alla navigazione Vai alla ricerca
Regressione di una curva con un modello a picco asimmetrico, utilizzando l'algoritmo di Gauss–Newton con un fattore di smorzamento α variabile.
Sopra: dati grezzi e curva del modello.
Sotto: evoluzione della somma normalizzata dei quadrati dei residui.

L'algoritmo di Gauss–Newton è un metodo iterativo per risolvere problemi di minimi quadrati e regressioni non lineari. È una versione modificata del metodo di Newton per trovare un minimo di una funzione. Diversamente da quest'ultimo, l'algoritmo di Gauss–Newton può essere utilizzato solo per minimizzare una somma di funzioni al quadrato, ma possiede il vantaggio che le derivate seconde, spesso faticose da calcolare, non sono richieste.

I problemi di minimi quadrati non lineari compaiono, ad esempio, nella regressione non lineare, in cui si cercano i parametri tali che il modello sia in buono accordo con le osservazioni disponibili.

Il nome del metodo deriva dai matematici Carl Friedrich Gauss e Isaac Newton.

Descrizione

Date m funzioni 𝒓=(r1,,rm) (spesso chiamati residui) di n variabili β=(β1,,βn), con mn, l'algoritmo di Gauss–Newton trova iterativamente i valori delle variabili in modo da minimizzare la seguente somma di quadrati:[1]

S(β)=i=1mri2(β).

Iniziando con β(0) come stima iniziale per il minimo, il metodo esegue iterativamente

β(s+1)=β(s)(𝐉𝐫𝖳𝐉𝐫)1𝐉𝐫𝖳𝐫(β(s)),

dove, se 𝒓 e β sono vettori colonna, gli elementi della matrice jacobiana sono

(𝐉𝐫)ij=ri(β(s))βj,

e il simbolo 𝖳 indica la matrice trasposta.

Se m=n, l'iterazione si semplifica e diventa

β(s+1)=β(s)(𝐉𝐫)1𝐫(β(s)),

che è una diretta generalizzazione in più dimensioni del metodo delle tangenti.

Nella regressione dei dati, in cui l'obiettivo è trovare i valori dei parametri β tali che una data funzione modello y=f(x,β) sia il più possibile in accordo con la serie di punti (xi,yi), le funzioni ri sono i residui:

ri(β)=yif(xi,β).

Allora, il metodo di Gauss–Newton può essere espresso in termini dello jacobiano 𝑱f della funzione f come

β(s+1)=β(s)+(𝐉𝐟𝖳𝐉𝐟)1𝐉𝐟𝖳𝐫(β(s)).

Da notare che (𝐉𝐟𝖳𝐉𝐟)1𝐉𝐟𝖳 è la pseudoinversa di 𝐉𝐟. Nell'algoritmo, l'assunzione mn è necessaria, altrimenti la matrice 𝐉𝐫𝖳𝐉𝐫 non è invertibile e le equazioni non possono essere risolte (almeno in modo unico).

L'algoritmo di Gauss–Newton si ottiene dall'approssimazione lineare del vettore delle funzioni ri utilizzando il teorema di Taylor. Infatti, a ogni iterazione si ottiene:

𝐫(β)𝐫(β(s))+𝐉𝐫(β(s))Δ

con Δ=ββ(s). Trovare Δ che minimizza la somma dei quadrati nel membro destro, cioè

min𝐫(β(s))+𝐉𝐫(β(s))Δ22,

è un problema dei minimi quadrati lineare, che si risolve esplicitamente.

Le equazioni normali sono n equazioni lineari simultanee nell'incremento Δ incognito. Si possono risolvere in un solo passaggio, usando la decomposizione di Cholesky, o, ancora meglio, la fattorizzazione QR di 𝐉𝐫. Per sistemi grandi, può essere più efficiente un metodo iterativo, come quello del gradiente coniugato. Se esiste una dipendenza lineare tra le colonne di 𝐉𝐫, le iterazioni falliranno a causa della singolarità di 𝐉𝐫𝖳𝐉𝐫.

Esempio

Curva di best fit ottenuta (in blu), con β^1=0.362 and β^2=0.556, insieme ai dati osservati (in rosso).

In questo esempio, l'algoritmo di Gauss–Newton viene usato per la regressione della velocità V di formazione del prodotto in una reazione catalizzata da un enzima in relazione alla concentrazione del substrato [S], secondo il modello di Michaelis-Menten. I dati misurati sono riportati nella seguente tabella. Le incertezze di ogni misura sono state messe uguali a 1.

i 1 2 3 4 5 6 7
[S] 0.038 0.194 0.425 0.626 1.253 2.500 3.740
V 0.050 0.127 0.094 0.2122 0.2729 0.2665 0.3317

La funzione modello è della forma

V=Vmax[S]KM+[S]

con parametri Vmax e KM da determinare attraverso l'algoritmo.

Siano xi e yi i valori di [S] e V rispettivamente nella tabella, con i=1,,7. Siano β1=Vmax e β2=KM. Si troveranno β1 e β2 tali che la somma dei quadrati dei residui

ri=yiβ1xiβ2+xi(i=1,,7)

sia minima.

Lo jacobiano 𝐉𝐫 del vettore dei residui ri rispetto alle incognite βj è una matrice 7×2 in cui nell'i-esima riga si trova

riβ1=xiβ2+xi;riβ2=β1xi(β2+xi)2.

Iniziando con una stima iniziale β1(0)=0.9 e β2(0)=0.2, dopo cinque iterazioni dell'algoritmo di Gauss–Newton, si ottengono i valori ottimali β^1=0.362 e β^2=0.556. La somma dei quadrati dei residui descresce dal valore iniziali di 1.445 a quello finale di 0.00784. Il grafico in figura mostra i dati nella tabella insieme alla curva modello con i parametri ottimali ottenuti dall'algoritmo. Sotto è riportata una tabella dei valori intermedi di β1 e β2 durante l'algoritmo.

Iterazione i β1(i) β2(i) S(β(𝐢))
1 0.33266293 0.26017391 0.015072
2 0.34280925 0.42607918 0.008458
3 0.35777522 0.52950844 0.007864
4 0.36140546 0.5536581 0.007844
5 0.36180308 0.55607253 0.007844
6 0.36183442 0.55625246 0.007844

Convergenza del metodo

Si può mostrare[2] che l'incremento Δ è una direzione di discesa per S, e, se l'algoritmo converge, che il limite è un punto stazionario di S. Tuttavia, la convergenza non è garantita, nemmeno quella locale come nel metodo delle tangenti, o sotto le comuni condizioni di Wolfe.[3]

La velocità di convergenza di Gauss–Newton può diventare quadratica.[4] L'algoritmo potrebbe anche convergere lentamente o affatto se la stima iniziale è lontana dal minimo oppure la matrice J𝐫𝖳𝐉𝐫 è mal condizionata. Per esempio, si consideri il problema con m=2 equazioni e n=1 variabili, dato da

r1(β)=β+1,r2(β)=λβ2+β1.

Il minimo è per β=0. (In realtà il minimo è per β=1 se λ=2, poiché S(0)=12+(1)2=2, ma S(1)=0.) Se λ=0, allora il problema diventa lineare e il metodo trova il minimo in una sola iterazione. Se |λ|<1, allora l'algoritmo converge linearmente e l'errore decresce asintoticamente di un fattore |λ| a ogni iterazione. Tuttavia, se |λ|>1, non c'è convergenza nemmeno locale.[5]

Derivazione dal metodo di Newton

In questo paragrafo, l'algoritmo di Gauss–Newton verrà derivato dal metodo di Newton per l'ottimizzazione di funzione. Come conseguenza, la velocità di convergenza dell'algoritmo di Gauss–Newton può essere quadratico sotto certe condizioni di regolarità. In generale (sotto condizioni più deboli), la convergenza è lineare.[6]

La relazione di ricorrenza per il metodo di Newton per la minimizzazione della funzione S di parametri β è

β(s+1)=β(s)𝐇1𝐠,

dove 𝐠 indica il vettore gradiente di S, e 𝐇 la sua matrice hessiana. Poiché S=i=1mri2, il gradiente è dato da

gj=2i=1mririβj.

Elementi dell'Hessiana si calcolano derivando le componenti del gradiente, gj, rispetto a βk:

Hjk=2i=1m(riβjriβk+ri2riβjβk).

Il metodo di Gauss–Newton si ottiene trascurando i termini con le derivate seconde (il secondo nell'espressione). Cioè, la matrice Hessiana è approssimata come

Hjk2i=1mJijJik,

dove Jij=riβj sono gli elementi del jacobiano 𝐉𝐫. Si possono riscrivere il gradiente e l'Hessiana approssimata in notazione matriciale come

𝐠=2𝐉𝐫𝖳𝐫,𝐇2𝐉𝐫𝖳𝐉𝐫.

Si sostituiscono queste espressioni nella relazione di ricorrenza precedente, così da ottenere l'equazioni dell'algoritmo

β(s+1)=β(s)+Δ;Δ=(𝐉𝐫𝖳𝐉𝐫)1𝐉𝐫𝖳𝐫.

La convergenza del metodo di Gauss–Newton non è garantita in tutte le situazioni. L'approssimazione

|ri2riβjβk||riβjriβk|,

che serve per trascurare le derivate seconde può essere valida in due casi, così da aspettarsi la convergenza dell'algoritmo:[7]

  1. I valori della funzione ri sono piccoli, almeno intorno al minimo.
  2. Le funzioni sono quasi-lineari, in modo che 2riβjβk sia relativamente piccolo.

Versioni migliorate dell'algoritmo

Con l'algoritmo di Gauss–Newton, la somma dei quadrati dei residui S può non decrescere a ogni interazione. Tuttavia, poiché Δ è una direzione di discesa, a meno che S(βs) sia un punto stazionario, vale che S(βs+αΔ)<S(βs) per ogni α>0 sufficientemente piccolo. Quindi, se il metodo diverge, una soluzione è di impiegare una frazione α dell'incremento Δ, utilizzando la seguente formula:

βs+1=βs+αΔ..

In altre parole, il vettore incremento è troppo lungo, ma è diretto verso il basso, perciò avanzare soltanto di una frazione di cammino diminuirà il valore della funzione oggettiva S. Si può trovare il valore ottimale di α usando un algoritmo di line search, cioè il valore α viene determinato trovando quello che minimizza S, di solito con un metodo di ricerca diretta nell'intervallo 0<α<1.

Nei casi in cui la frazione ottimale α è vicina a zero, un metodo alternativo per il trattamento della divergenza è l'utilizzo dell'algoritmo di Levenberg-Marquardt, anche conosciuto come "metodo della regione di confidenza".[1] Le equazioni normali sono modificate in modo che l'incremento sia rotato verso la direzione di massima decrescita,

(𝐉T𝐉+λ𝐃)Δ=𝐉T𝐫,

dove 𝐃 è una matrice diagonale positiva. Da notare che quando 𝐃 è la matrice identità 𝐈 e λ+, allora λΔ=λ(𝐉T𝐉+λ𝐈)1(𝐉T𝐫)=(𝐈𝐉T𝐉/λ+)(𝐉T𝐫)𝐉T𝐫, perciò la direzione di Δ si avvicina alla direzione del gradiente negativo 𝐉T𝐫.

Il parametro di Marquardt λ può essere ottimizzato attraverso un line search, ma è molto inefficiente, dato che il vettore incremento deve essere ricalcolato a ogni modifica di λ. Una strategia più efficiente è questa: quando il metodo diverge, si incrementa il parametro di Marquardt fintanto che si ha una decrescita di S. Quindi si conserva il valore da una iterazione a quella successiva, ma si diminuisce fino a che non si raggiunge un valore limite, quando il parametro di Marquardt può essere posto uguale a 0; la minimizzazione di S diventa pertanto una ottimizzazione standard di Gauss–Newton.

Ottimizzazione su larga scala

Per l'ottimizzazione su larga scala, l'algoritmo di Gauss–Newton è di particolare interesse perché in generale vale (sebbene non sempre) che la matrice 𝐉𝐫 è molto più sparsa dell'Hessiana approssimata 𝐉𝐫𝖳𝐉𝐫. In questi casi, il passo dell'algoritmo viene fatto con un metodo iterativo approssimato adatto a problemi grandi e sparsi, come il metodo del gradiente coniugato.

Per far funzionare questo approccio, serve almeno un metodo efficiente per calcolare il calcolare il prodotto

𝐉𝐫𝖳𝐉𝐫𝐩

per un qualche vettore 𝐩. Per l'immagazzinamento della matrice sparsa, in genere è pratico memorizzare le righe di 𝐉𝐫 in una forma compressa (cioè, senza gli elementi nulli), rendendo però il calcolo diretto del prodotto precedente alquanto complicato per via della trasposizione. Tuttavia, se si definisce 𝐜𝐢 come la riga i-esima della matrice 𝐉𝐫, vale la seguente semplice relazione:

𝐉𝐫𝖳𝐉𝐫𝐩=i𝐜i(𝐜i𝐩),

in modo che ogni riga contribuisce additivamente e indipendentemente al prodotto. In aggiunta alla memorizzazione molto pratica, questa espressione è adatta al calcolo parallelo. Da notare che ogni riga 𝐜𝐢 è il gradiente del rispettivo residuo ri; tenendo conto di questo, la forma precedente enfatizza il fatto che i residui contribuiscono al problema in modo indipendente uno dall'altro.

Algoritmi collegati

In un metodo quasi-Newton, come quello dovuto a Davidon, Fletcher e Powell oppure a Broyden–Fletcher–Goldfarb–Shanno (metodo BFGS), si calcola numericamente una stima della Hessiana 2Sβjβk usando solo le derivate prime riβj, in modo che solo dopo n cicli di perfezionamento il metodo si avvicina approssimativamente a quello di Newton in termini di prestazioni. Da notare che i metodi quasi-Newton possono minimizzare funzioni arbitrarie a valori reali, mentre Gauss–Newton, Levenberg–Marquardt, ecc. risolvono solo problemi di minimi quadrati non lineari.

Un altro metodo per risolvere problemi di minimo usando solo derivate prime è la discesa del gradiente. Tuttavia, quest'ultimo metodo non considera le derivate seconde nemmeno approssimativamente, perciò è altamente inefficiente per molte funzioni, specialmente se i parametri hanno una forte correlazione.

Note

  1. 1,0 1,1 Björck (1996)
  2. Björck (1996), p. 260.
  3. Template:Cita pubblicazione
  4. Björck (1996), p. 341, 342.
  5. Fletcher (1987), p. 113.
  6. Template:Cita web
  7. Nocedal (1999), p. 259.

Bibliografia

Collegamenti esterni

Implementazioni

  • Artelys Knitro è un risolutore non lineare con un'implementazione del metodo di Gauss–Newton. È scritto in linguaggio C e possiede interfacce per C++/C#/Java/Python/MATLAB/R.

Template:Portale