Qual è lo stato dell'arte attuale degli algoritmi per la scomposizione del valore singolare?


12

Sto lavorando su una libreria di matrici solo intestazione per fornire un ragionevole grado di capacità di algebra lineare nel più semplice pacchetto possibile, e sto cercando di esaminare quale sia l'attuale stato dell'arte: calcolare l'SVD di un matrice complessa.

Sto facendo una decomposizione in due fasi, bidiagonalizzazione seguita da un singolo calcolo del valore. In questo momento sto usando il metodo capofamiglia per la bidiagonalizzazione (credo che LAPACK usi anche questo), e penso che sia buono come lo è attualmente (a meno che qualcuno non conosca un algoritmo per esso ..) . O(N2)

Il calcolo del valore singolare è il prossimo nella mia lista, e sono un po 'fuori dal giro su ciò che gli algoritmi comuni sono per fare questo. Ho letto qui che la ricerca si stava dirigendo verso un metodo di iterazione inversa che garantisce l'ortogonalità con complessità . Sarei interessato a conoscere questo o altri progressi.O(N)


c'è un documento per la tua libreria di matrici solo intestazione (a parte il .h)? Inoltre, aggiungi il tag "svd".
denis,

Risposte:


7

Gli "algoritmi randomizzati" sono recentemente diventati piuttosto popolari per gli svds parziali. Un'implementazione solo dell'intestazione può essere scaricata qui: http://code.google.com/p/redsvd/

Una revisione dei metodi attuali è disponibile qui: http://arxiv.org/abs/0909.4061

Per svds completi non sono sicuro che tu possa fare di meglio di Householder.


Sembra molto interessante, dovrò dare un'occhiata a quel documento di indagine, grazie!
gct

OP è interessato agli algoritmi per matrici dense. Non penso che gli algoritmi randomizzati siano competitivi in ​​quell'impostazione, se funzionano affatto.
Federico Poloni,

Questo post ha indicato che i metodi randomizzati funzionano bene su matrici dense research.facebook.com/blog/294071574113354/fast-randomized-svd
dranxo

@dranxo Non ci sono paragoni di accuratezza su quel post e i risultati di cronometraggio non sembrano molto meticolosi. Inoltre, gli algoritmi randomizzati si basano sulla proiezione + soluzione esatta di un problema su piccola scala. Ciò significa che l'OP avrebbe comunque bisogno di implementare un "metodo standard" per il conseguente problema su piccola scala.
Federico Poloni,

Giusto. Anche se sono un po 'confuso sul perché dovremmo pensare che questi metodi funzionano solo su matrici sparse. Estratto dall'estratto dell'articolo di Joel Tropp: "Per una matrice di input densa, gli algoritmi randomizzati richiedono operazioni in virgola mobile (flop) O (mn log (k)) in contrasto con O (mnk) per gli algoritmi classici". arxiv.org/pdf/0909.4061v2.pdf
dranxo

4

O(N)

(Volevo solo fare alcuni commenti poiché non ho il tempo di scrivere i dettagli, ma è diventato piuttosto grande per la casella dei commenti.)

LDLUDU

La parte del "valore singolare" dell'algoritmo, d'altra parte, deriva dall'algoritmo (spostato) della differenza del quoziente differenziale (dqd (s)) , che è il culmine di un lavoro precedente di Fernando, Parlett , Demmel e Kahan (con ispirazione di Heinz Rutishauser).

Come forse saprai, i metodi SVD di solito procedono con una decomposizione bidiagonale prima di ottenere i valori singolari dalla matrice bidiagonale. Purtroppo non sono troppo aggiornato sull'attuale miglior metodo per la decomposizione bidiagonale front-end; ultimo controllo, il solito metodo è iniziare con la decomposizione QR con la rotazione della colonna e quindi applicare le trasformazioni ortogonali in modo appropriato al fattore triangolare per ottenere finalmente la decomposizione bidiagonale.

Capisco che sono stato succinto con i dettagli; Proverò ad approfondire ulteriormente questa risposta una volta che avrò accesso alla mia biblioteca ...


Matrice in forma bi-diagonale, fai una colonna e poi una riga, ripeti la diagonale: usa givens o capofamiglia per azzerare la colonna fino alla diagonale, quindi fai lo stesso per la riga alla super-diagonale.
Adam W,

UAVUU=IVV=I

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.