In termini molto generali, ci sono due approcci per calcolare autovalori o scomposizioni di valori singolari. Un approccio consiste nel diagonalizzare la matrice e ciò produce essenzialmente la decomposizione dell'intero autovalore / valore singolare (l'intero spettro degli autovalori) allo stesso tempo, vedere una panoramica qui: Quali sono algoritmi efficienti per calcolare la decomposizione di valore singolare (SVD)? L'alternativa è utilizzare un algoritmo iterativo che produce uno (o più) autovettori alla volta. Le iterazioni possono essere arrestate dopo che è stato calcolato il numero desiderato di autovettori.
Non credo che esistano algoritmi iterativi specifici per SVD. Questo perché si può calcolare SVD di una matrice B facendo un'eigendecomposition di un quadrata simmetrica ( n + m ) x ( n + m ) matrice A = ( 0 B B ⊤ 0 ) . Pertanto, invece di chiedere quali algoritmi calcolano SVD troncato, dovresti chiedere quali algoritmi iterativi calcolano la composizione elettronica: algoritmo per SVD troncato ≈ algoritmo iterativo per la composizione elettronica .n×mB( n + m ) × ( n +m)
A = ( 0B⊤B0) .
algoritmo per troncato SVD ≈ algoritmo iterativo per eigendecomposition .
L'algoritmo iterativo più semplice si chiama power iteration ed è davvero molto semplice:
- Inizializza casuale .X
- Aggiornamento .x ← A x
- Normalizza .x ← x / ∥ x ∥
- Andare al passaggio n. 2 a meno che non sia convergente.
Tutti gli algoritmi più complessi si basano in definitiva sull'idea dell'iterazione di potenza, ma diventano piuttosto sofisticati. La matematica necessaria è data dai sottospazi di Krylov . Gli algoritmi sono iterazione di Arnoldi (per matrici quadrate non simmetriche), iterazione di Lanczos (per matrici simmetriche quadrate) e loro varianti come ad esempio "metodo Lanczos a riavvio implicito" e quant'altro.
Puoi trovarlo descritto ad esempio nei seguenti libri di testo:
- Prestito Golub & Van, calcoli con matrici
- Trefethen & Bau, algebra lineare numerica
- Demmel, algebra lineare numerica applicata
- Saad, metodi numerici per problemi di autovalori di grandi dimensioni
Tutti i ragionevoli linguaggi di programmazione e pacchetti statistici (Matlab, R, Python numpy, tu lo chiami) usano le stesse librerie Fortran per eseguire decomposizioni eigen / singular value. Questi sono LAPACK e ARPACK . ARPACK sta per ARnoldi PACKage ed è tutto incentrato sulle iterazioni di Arnoldi / Lanczos. Ad esempio in Matlab ci sono due funzioni per SVD: svd
esegue la decomposizione completa tramite LAPACK, e svds
calcola un determinato numero di singoli vettori tramite ARPACK ed è in realtà solo un wrapper per una eigs
chiamata sulla matrice "quadrata".
Aggiornare
BUNUNBUN
Esiste una libreria Fortran anche per questi metodi, si chiama PROPACK :
Il pacchetto software PROPACK contiene una serie di funzioni per calcolare la scomposizione del valore singolare di matrici grandi, sparse o strutturate. Le routine SVD si basano sull'algoritmo di bidiagonalizzazione di Lanczos con reorthogonalization parziale (BPRO).
Tuttavia, PROPACK sembra essere molto meno standard di ARPACK e non è supportato nativamente nei linguaggi di programmazione standard. È stato scritto da Rasmus Larsen, che ha una grande bidiagonalizzazione di Lanczos del 1998, lunga 90 pagine, con parzializzazione parziale con quella che sembra una buona visione d'insieme. Grazie a @MichaelGrant tramite questo thread di Computational Science SE .
Tra gli articoli più recenti, il più popolare sembra essere Baglama & Reichel, 2005, Augmented ha ricominciato implicitamente i metodi di bidiagonalizzazione di Lanczos , che è probabilmente intorno allo stato dell'arte. Grazie a @Dougal per aver fornito questo link nei commenti.
Aggiornamento 2
C'è davvero un approccio completamente diverso descritto in dettaglio nel documento di sintesi che hai citato tu stesso: Halko et al. 2009, Trovare una struttura con casualità: algoritmi probabilistici per la costruzione di decomposizioni di matrice approssimative . Non ne so abbastanza per commentare.