# Algoritmo di Levenberg-Marquardt

L'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, e fu riscoperto nel 1963 da Donald Marquardt e, indipendentemente, da Girard, Wynne e Morrison.

## 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 $\left(x_{i},y_{i}\right)$, si vuole determinare il vettore di parametri ${\hat {\boldsymbol {\beta }}}$ del modello $f\left(x,{\boldsymbol {\beta }}\right)$ che minimizza la somma dei quadrati residui $S\left({\boldsymbol {\beta }}\right)$
    ${\hat {\boldsymbol {\beta }}}\in \operatorname {argmin} \limits _{\boldsymbol {\beta }}S\left({\boldsymbol {\beta }}\right)\equiv \operatorname {argmin} \limits _{\boldsymbol {\beta }}\sum _{i=1}^{m}\left[y_{i}-f\left(x_{i},{\boldsymbol {\beta }}\right)\right]^{2}.$
L'algoritmo di Levenberg-Marquardt è un metodo iterativo che parte da una stima iniziale del vettore ${\boldsymbol {\beta }}$. 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 ${\boldsymbol {\beta }}$ viene aggiornata ad un nuovo valore ${\boldsymbol {\beta }}+{\boldsymbol {\delta }}$. Per determinare la scelta di ${\boldsymbol {\delta }}$, la funzione $f$ viene linearizzata con un polinomio di Taylor
    $f\left(x_{i},{\boldsymbol {\beta }}+{\boldsymbol {\delta }}\right)\approx f\left(x_{i},{\boldsymbol {\beta }}\right)+\mathbf {J} _{i}{\boldsymbol {\delta }},$
dove
    $\mathbf {J} _{i}={\frac {\partial f\left(x_{i},{\boldsymbol {\beta }}\right)}{\partial {\boldsymbol {\beta }}}}$
è il gradiente di $f$ rispetto a ${\boldsymbol {\beta }}$.
Usando tale approssimazione, la somma dei quadrati residui $S\left({\boldsymbol {\beta }}\right)$ diventa
    $S\left({\boldsymbol {\beta }}+{\boldsymbol {\delta }}\right)\approx \sum _{i=1}^{m}\left[y_{i}-f\left(x_{i},{\boldsymbol {\beta }}\right)-\mathbf {J} _{i}{\boldsymbol {\delta }}\right]^{2},$
o, in notazione vettoriale
    ${\begin{aligned}S\left({\boldsymbol {\beta }}+{\boldsymbol {\delta }}\right)&\approx \left\|\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)-\mathbf {J} {\boldsymbol {\delta }}\right\|^{2}\\&=\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)-\mathbf {J} {\boldsymbol {\delta }}\right]^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)-\mathbf {J} {\boldsymbol {\delta }}\right]\\&=\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]-\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]^{\mathrm {T} }\mathbf {J} {\boldsymbol {\delta }}-\left(\mathbf {J} {\boldsymbol {\delta }}\right)^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]+{\boldsymbol {\delta }}^{\mathrm {T} }\mathbf {J} ^{\mathrm {T} }\mathbf {J} {\boldsymbol {\delta }}\\&=\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]-2\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right]^{\mathrm {T} }\mathbf {J} {\boldsymbol {\delta }}+{\boldsymbol {\delta }}^{\mathrm {T} }\mathbf {J} ^{\mathrm {T} }\mathbf {J} {\boldsymbol {\delta }}.\end{aligned}}$
La somma dei quadrati residui $S\left({\boldsymbol {\beta }}\right)$ ha un minimo in un punto dove il gradiente rispetto al vettore dei parametri si annulla. Derivando l'espressione precedente rispetto a ${\boldsymbol {\delta }}$ ed imponendo l'uguaglianza a zero, si ottiene
    $\left(\mathbf {J} ^{\mathrm {T} }\mathbf {J} \right){\boldsymbol {\delta }}=\mathbf {J} ^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right],$
dove $\mathbf {J}$ è la matrice jacobiana, la cui riga $i$-esima è data da $\mathbf {J} _{i}$, e dove $\mathbf {f} \left({\boldsymbol {\beta }}\right)$ e $\mathbf {y}$ sono vettori le cui righe $i$-esime sono date rispettivamente da $f\left(x_{i},{\boldsymbol {\beta }}\right)$ e $y_{i}$. La matrice jacobiana ha dimensione $m\times n$, dove $n$ è il numero di parametri, ovvero la dimensione del vettore ${\boldsymbol {\beta }}$, e il prodotto $\left(\mathbf {J} ^{\mathrm {T} }\mathbf {J} \right)$ è una matrice quadrata di dimensione $n\times n$.
Risolvendo tale sistema lineare rispetto a ${\boldsymbol {\delta }}$ 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
    $\left(\mathbf {J} ^{\mathrm {T} }\mathbf {J} +\lambda \mathbf {I} \right){\boldsymbol {\delta }}=\mathbf {J} ^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right],$
dove $\mathbf {I}$ è la matrice identità. Il fattore $\lambda$ 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 $\mathbf {J} ^{\text{T}}\mathbf {J} +\lambda \mathbf {I}$ è praticamente ignorato quando il parametro di smorzamento $\lambda$ ha un valore elevato. Una variante proposta da Fletcher sostituisce la matrice identità con la diagonale di $\mathbf {J} ^{\text{T}}\mathbf {J}$, scalando ogni parametro rispetto alla curvatura e di conseguenza aumentando la velocità di convergenza lungo le direzioni nelle quali il gradiente è minore:
    $\left[\mathbf {J} ^{\mathrm {T} }\mathbf {J} +\lambda \operatorname {diag} \left(\mathbf {J} ^{\mathrm {T} }\mathbf {J} \right)\right]{\boldsymbol {\delta }}=\mathbf {J} ^{\mathrm {T} }\left[\mathbf {y} -\mathbf {f} \left({\boldsymbol {\beta }}\right)\right].$
Esistono diverse euristiche per la scelta del parametro di smorzamento $\lambda$. Marquardt suggerì di usare una scelta iniziale $\lambda _{0}$ e un fattore di aggiornamento $\nu$, e di calcolare la funzione obiettivo dopo un'iterazione dal valore iniziale ponendo $\lambda =\lambda _{0}$, e per un'iterazione dal valore iniziale con $\lambda ={\frac {\lambda _{0}}{\nu }}$. Se uno dei due valori produce un miglioramento maggiore della funzione costo rispetto all'altro, viene usato come nuovo valore di $\lambda$. Se in entrambi i casi la funzione costo ha un valore superiore a quello iniziale, $\lambda$ è moltiplicato per $\nu$ iterativamente $k$ volte, fino a quando non si ottiene un valore migliore, ponendo quindi $\lambda =\lambda _{0}\nu ^{k}$.