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.
Se chiamo semplicemente la svd
routine dal numpy.linalg
modulo 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 .
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.
full_matrices
che 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?
numpy
backend utilizza il codice fortran, la LAPACKE_dgesvd
routine 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.