Come calcolare SVD di una matrice sparsa enorme?


26

Qual è il modo migliore per calcolare la decomposizione a valore singolare (SVD) di una matrice positiva molto grande (65 M x 3,4 M) in cui i dati sono estremamente scarsi?

Meno dello 0,1% della matrice è diverso da zero. Ho bisogno di un modo che:

  • andrà bene nella memoria (so che esistono metodi online)
  • sarà calcolato in un tempo ragionevole: 3,4 giorni
  • sarà abbastanza accurato, tuttavia l'accuratezza non è la mia principale preoccupazione e vorrei essere in grado di controllare quante risorse ho messo in esso.

Sarebbe bello avere una libreria Haskell, Python, C # ecc. Che la implementa. Non sto usando mathlab o R ma, se necessario, posso andare con R.


3
Quanta memoria hai? 0,1% di 65 M * 3,4 M è ancora 221e9 valori diversi da zero. Se si utilizzano 4 byte per valore, che è comunque superiore a 55 GB, senza presupporre un sovraccarico, quindi la scarsità non risolve ancora il problema ... È necessario caricare l'intero set in memoria contemporaneamente?
Bitwise,

Avrei dovuto essere più preciso. Non più di 250-500mb con numero intero a 32 bit. Probabilmente molto meno, ma la dimensione dimensionale è il problema per come lo capisco. Ho una macchina da 16 GB.
Sonia,

Cosa ne pensi di questo? quora.com/…
Bitwise,

Questa pagina web si collega a una libreria Python che implementa "un algoritmo SVD veloce, incrementale, a bassa memoria, a matrice larga": en.wikipedia.org/wiki/Latent_semantic_analysis
Bitwise,

Risposte:


21

Se si adatta alla memoria, costruisci una matrice sparsa in R usando il pacchetto Matrix e prova irlba per SVD. È possibile specificare il numero di vettori singoli desiderati nel risultato, che è un altro modo per limitare il calcolo.

È una matrice piuttosto grande, ma in passato ho avuto ottimi risultati con questo metodo. irlbaè piuttosto all'avanguardia. Utilizza l' algoritmo di bi-diagonalizzazione Lanczos riavviato implicitamente .

Può masticare il set di dati del premio netflix (480.189 righe per 17.770 colonne, 100.480.507 voci diverse da zero) in millisecondi. Il set di dati è ~ 200.000 volte più grande del set di dati Netflix, quindi richiede molto più tempo. Potrebbe essere ragionevole aspettarsi che potrebbe fare il calcolo in un paio di giorni.


la matrice di dati si adatta alla memoria, irlba gestirà anche la decomposizione in modo efficiente in memoria?
Sonia,

@Sonia: irlba è molto efficiente in termini di memoria: calcola una soluzione approssimativa, puoi limitare il numero di singoli vettori ed è stato progettato per funzionare su matrici sparse. Per quanto ne so, è più veloce che otterrai per il calcolo di SVD parziali.
Zach,

@Sonia: buona fortuna!
Zach,

Ci ho provato - esaurito la memoria ... Prima di eseguirlo, calcolerò una forma di blocco triangolare.
Sonia,

@Sonia lo hai archiviato come scarso Matrix? Prova a limitare il numero di valori singolari che calcoli ... forse dai un'occhiata ai primi 10?
Zach,

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.