Algoritmo di Levenberg-Marquardt

Da testwiki.
Vai alla navigazione Vai alla ricerca

LTemplate:'algoritmo di Levenberg-Marquardt (LMA) è un algoritmo di ottimizzazione usato per la soluzione di problemi in forma di minimi quadrati non lineari, che trova comunemente applicazioni in problemi di curve fitting. LMA è un algoritmo iterativo, nel quale il vettore di aggiornamento della soluzione ad ogni iterazione è dato da un'interpolazione fra l'algoritmo di Gauss-Newton e il metodo di discesa del gradiente. LMA può essere considerato come una versione trust region dell'algoritmo di Gauss-Newton, rispetto al quale è più robusto ma, in generale, leggermente più lento. L'algoritmo è stato pubblicato nel 1944 da Kenneth Levenberg,[1] e fu riscoperto nel 1963 da Donald Marquardt[2] e, indipendentemente, da Girard,[3] Wynne[4] e Morrison.[5]

Formulazione

L'applicazione principale dell'algoritmo di Levenberg-Marquardt è il problema di curve fitting tramite minimi quadrati non lineari. Dato un insieme di m osservazioni (xi,yi), si vuole determinare il vettore di parametri β^ del modello f(x,β) che minimizza la somma dei quadrati residui S(β)

β^argminβS(β)argminβi=1m[yif(xi,β)]2.

L'algoritmo di Levenberg-Marquardt è un metodo iterativo che parte da una stima iniziale del vettore β. Nel caso di funzioni non-convesse con più minimi locali, la scelta di una stima iniziale sufficientemente vicina al punto di ottimo globale è importante per la convergenza. Ad ogni iterazione, la stima corrente della soluzione β viene aggiornata ad un nuovo valore β+δ. Per determinare la scelta di δ, la funzione f viene linearizzata con un polinomio di Taylor

f(xi,β+δ)f(xi,β)+𝐉iδ,

dove

𝐉i=f(xi,β)β

è il gradiente di f rispetto a β.

Usando tale approssimazione, la somma dei quadrati residui S(β) diventa

S(β+δ)i=1m[yif(xi,β)𝐉iδ]2,

o, in notazione vettoriale

S(β+δ)𝐲𝐟(β)𝐉δ2=[𝐲𝐟(β)𝐉δ]T[𝐲𝐟(β)𝐉δ]=[𝐲𝐟(β)]T[𝐲𝐟(β)][𝐲𝐟(β)]T𝐉δ(𝐉δ)T[𝐲𝐟(β)]+δT𝐉T𝐉δ=[𝐲𝐟(β)]T[𝐲𝐟(β)]2[𝐲𝐟(β)]T𝐉δ+δT𝐉T𝐉δ.

La somma dei quadrati residui S(β) ha un minimo in un punto dove il gradiente rispetto al vettore dei parametri si annulla. Derivando l'espressione precedente rispetto a δ ed imponendo l'uguaglianza a zero, si ottiene

(𝐉T𝐉)δ=𝐉T[𝐲𝐟(β)],

dove 𝐉 è la matrice jacobiana, la cui riga i-esima è data da 𝐉i, e dove 𝐟(β) e 𝐲 sono vettori le cui righe i-esime sono date rispettivamente da f(xi,β) e yi. La matrice jacobiana ha dimensione m×n, dove n è il numero di parametri, ovvero la dimensione del vettore β, e il prodotto (𝐉T𝐉) è una matrice quadrata di dimensione n×n.

Risolvendo tale sistema lineare rispetto a δ si ottiene il vettore di aggiornamento della soluzione secondo il metodo di Gauss-Newton. L'idea originale di Levenberg è di sostituire la precedente equazione con una versione smorzata

(𝐉T𝐉+λ𝐈)δ=𝐉T[𝐲𝐟(β)],

dove 𝐈 è la matrice identità. Il fattore λ determina il comportamento dell'algoritmo, e un valore ridotto corrisponde ad un comportamento prossimo al metodo di Gauss-Newton, mentre un valore elevato corrisponde a spostare la soluzione in direzione pressappoco opposta al gradiente, con un comportamento più simile al metodo di discesa del gradiente. Il valore viene adattato ad ogni iterazione, incrementandolo se la precedente iterazione ha prodotto una riduzione limitata della funzione obiettivo, o diminuendolo in caso di rapida diminuzione.

Uno degli svantaggi della formulazione di Levenberg è il fatto che il termine 𝐉T𝐉+λ𝐈 è praticamente ignorato quando il parametro di smorzamento λ ha un valore elevato. Una variante proposta da Fletcher[6] sostituisce la matrice identità con la diagonale di 𝐉T𝐉, scalando ogni parametro rispetto alla curvatura e di conseguenza aumentando la velocità di convergenza lungo le direzioni nelle quali il gradiente è minore:

[𝐉T𝐉+λdiag(𝐉T𝐉)]δ=𝐉T[𝐲𝐟(β)].

Esistono diverse euristiche per la scelta del parametro di smorzamento λ. Marquardt suggerì di usare una scelta iniziale λ0 e un fattore di aggiornamento ν, e di calcolare la funzione obiettivo dopo un'iterazione dal valore iniziale ponendo λ=λ0, e per un'iterazione dal valore iniziale con λ=λ0ν. Se uno dei due valori produce un miglioramento maggiore della funzione costo rispetto all'altro, viene usato come nuovo valore di λ. Se in entrambi i casi la funzione costo ha un valore superiore a quello iniziale, λ è moltiplicato per ν iterativamente k volte, fino a quando non si ottiene un valore migliore, ponendo quindi λ=λ0νk.

Note

Bibliografia

Collegamenti esterni

Template:Portale