Come viene calcolato in pratica l'SVD di una matrice


11

In che modo MATLAB, ad esempio, calcola l'SVD di una data matrice? Presumo che la risposta probabilmente comporti il ​​calcolo degli autovettori e degli autovalori di A*A'. Se è così, vorrei anche sapere come li calcola?



4
In realtà, no, non comporta il calcolo degli autovettori e dei valori di ! Ciò ridurrebbe notevolmente la precisione del risultato. AAT
Michael Grant,

Risposte:


11

Questo viene in genere fatto utilizzando l'algoritmo Golub-Reinsch e no, non comporta il calcolo di autovalori e autovettori di . UNUNT

Vedere

GH Golub e C. Reinsch. Decomposizione del valore singolare e soluzioni dei minimi quadrati. Numerische Mathematik 14: 403-420, 1970.

Questo materiale è discusso in molti libri di testo sull'algebra lineare numerica.


13

A parte il (ora classico) documento Golub-Reinsch che Brian nota nella sua risposta (ho collegato alla versione del manuale del documento), così come il precedente documento (anche ora classico) di Golub-Kahan , ci sono stati un numero di importanti sviluppi nel calcolo dell'SVD da allora. Innanzitutto, devo riassumere come funziona il solito metodo.

L'idea nel calcolare l'SVD di una matrice è qualitativamente simile al metodo usato per calcolare la composizione elettronica di una matrice simmetrica (e, come notato nell'OP, esiste una relazione intima tra di loro). In particolare, si procede in due fasi: la trasformazione in una matrice bidiagonale , e quindi trovare l'SVD di una matrice bidiagonale. Ciò è del tutto analogo alla procedura di riduzione dapprima di una matrice simmetrica in forma tridiagonale, e quindi di calcolo della composizione elettronica della risultante tridiagonale.

Per calcolare l'SVD di una matrice bidiagonale, una svolta particolarmente interessante è stata l' articolo di Jim Demmel e Velvel Kahan , che ha dimostrato che è possibile calcolare con precisione anche i minuscoli valori singolari di una matrice bidiagonale, modificando opportunamente il metodo inizialmente proposto in Golub-Reinsch. Questo è stato poi seguito dal (ri?) Scoperta del DQD dell'algoritmo , che è un discendente del vecchio algoritmo di quoziente-differenza di Rutishauser. (Beresford Parlett dà una bella discussione qui.) Se la memoria serve, questo è ora il metodo preferito usato internamente da LAPACK. A parte questo, è sempre stato possibile ricavare versioni SVD di sviluppi nella soluzione di autovalori simmetrici; per esempio, esiste una versione SVD di divide-and-conquer, nonché una versione SVD del vecchio algoritmo Jacobi (che può essere più preciso in alcune circostanze).

Per quanto riguarda la bidiagonalizzazione, nel documento di Barlow è stato delineato un metodo migliorato , che richiede un po 'più di lavoro rispetto alla procedura originale di Golub e Reincsh, ma produce matrici bidiagonali più accurate.


1
@ Jack, hai visto questo per caso?
JM

Sorprendentemente, non l'ho fatto!
Jack Poulson
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.