Implementazione efficiente della memoria delle decomposizioni parziali del valore singolare (SVD)


10

Per la riduzione del modello, voglio calcolare i vettori singolari di sinistra associati ai - diciamo 20 - valori singolari più grandi di una matrice , dove N 10 6 e k 10 3 . Sfortunatamente, la mia matrice A sarà densa senza alcuna struttura.UNRN,KN106K103UN

Se chiamo semplicemente la svdroutine dal numpy.linalgmodulo in Python per una matrice casuale di queste dimensioni, mi imbatto in un errore di memoria. Ciò è dovuto alla destinazione di per la decomposizione A = V S U .VRN,NA=VSU

Ci sono algoritmi in giro che evitano questa trappola? Ad esempio impostando solo i singoli vettori associati a valori singolari diversi da zero.

Sono pronto a scambiare tempo e precisione di calcolo.


1
Interessante, sembra che Numpy non sappia come fare un SVD sottile ...
JM,

Grazie per il suggerimento. Infatti, numpy.linalg.svd ha l'opzione full_matricesche deve essere impostata su False in modo che vengano calcolate solo le parti 'diverse da zero'. Tuttavia, c'è un modo per ridurre ulteriormente il calcolo?
Jan

3
Il numpybackend utilizza il codice fortran, la LAPACKE_dgesvdroutine per svd standard. Tuttavia, in genere la tua matrice è C_CONTIGOUS(verifica con matrix.flags). Pertanto copia i dati per l'allineamento Fortran. Inoltre, durante l'esecuzione del dackvd di routine, è necessaria un'altra copia della matrice (o almeno la memoria per essa). È possibile eliminare una copia se si assicura che l'allineamento della memoria sia in stile Fortran sin dall'inizio.
Bort

Risposte:





2

Intel MKL implementa il nuovo algoritmo Jacobi-SVD. Ecco i dettagli di implementazione: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

E la routine LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

Le dimensioni del lavoro sono ovviamente regolabili. Puoi chiamare facilmente le funzioni C da Python usando Cython, SWIG o qualsiasi altro meccanismo di avvolgimento.

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.