2013-03-14 5 views
7

So che ci sono pacchetti in R per archiviare efficientemente matrici sparse. C'è anche un modo per memorizzare una matrice di basso grado in modo efficiente? Per esempio:Memorizzare efficientemente una matrice grande ma di basso grado

A <- matrix(rnorm(1e6), nrow=1e5, ncol=1e1) 
B <- A %*% t(A) 

Ora, B è troppo grande per memorizzare nella memoria, ma è a basso contenuto di rango. C'è un modo per costruire e memorizzare B in modo efficiente, in modo tale che alcuni metodi di lettura di base (rowSums, colSums, ecc.) Vengano eseguiti al volo, al fine di scambiare cpu o memoria?

+0

Interessante domanda: quali applicazioni avrebbe? (Dove appaiono generalmente le matrici di basso rango?) –

+0

@DavidRobinson: Queste matrici vengono utilizzate, ad esempio, come approssimazioni di matrici di grandi dimensioni (troppo grandi per calcolare, o anche per memorizzare), in alcuni [algoritmi di ottimizzazione] (http://en.wikipedia.org/wiki/Limited-memory_BFGS). –

+1

Se sei disposto ad approssimare B, potresti usare un'approssimazione a bassa dimensione, ad es. utilizzare un SVD e mantenere le prime n dimensioni del SVD? Non è sicuro che sia proprio quello che vuoi, ma potrebbe valere la pena di essere preso in considerazione. –

risposta

0

Ecco un altro approccio, anche se mi manca l'esperienza per sapere quanto sia efficiente questo sarebbe per le grandi matrici:

Se il rango è basso significa la matrice contiene molte linee irrilevanti, che sono combinazioni lineari degli altri. Se la matrice rappresenta un sistema lineare di equazioni, si potrebbe progettare un algoritmo, che successivamente rimuove quelle linee.

Per verificare se una riga è irrilevante, controllare se il rango della matrice senza quella riga è ancora lo stesso. Per calcolare il rango matrice, vedere la risposta this e that.

+1

Questo suona fondamentalmente come un metodo di factoring molto costoso :-) – Jeroen

+0

Scusate, ma terribilmente idea scarsa che funziona solo per un caso semplice, con righe replicate. In effetti, è TRIVIAL per generare una matrice di rango 1, che non ha replicato righe o colonne. Quindi scegli i vettori di riga casuali U e V, quindi U '* V ha il rango 1. –

2

La tua domanda è già la risposta: per archiviare in modo efficiente una matrice di basso rango, si crea una struttura di dati contenente entrambi i fattori. Se è richiesta la moltiplicazione di matrice vettoriale, può essere eseguita da destra a sinistra utilizzando i prodotti a matrice di elementi dei fattori.

Un'applicazione di questa strategia e struttura dati può essere trovata nelle implementazioni dei metodi quasi-newton Broyden o BFGS a memoria limitata.