Pour la réduction du modèle, je veux calculer les vecteurs singuliers de gauche associés aux - disons 20 - plus grandes valeurs singulières d'une matrice , où N ≈ 10 6 et k ≈ 10 3 . Malheureusement, ma matrice A sera dense sans aucune structure.
Si j'appelle simplement la svd
routine du numpy.linalg
module en Python pour une matrice aléatoire de cette taille, je rencontre une erreur de mémoire. Cela est dû à la répartition du pour la décomposition A = V S U .
Existe-t-il des algorithmes qui évitent cet écueil? Par exemple, en définissant uniquement les vecteurs singuliers associés à des valeurs singulières non nulles.
Je suis prêt à échanger du temps de calcul et de la précision.
full_matrices
qui peut être définie sur False afin que seules les parties «non nulles» soient calculées. Néanmoins, existe-t-il un moyen de réduire encore plus le calcul?
numpy
backend utilise le code fortran, la LAPACKE_dgesvd
routine pour svd standard. Cependant, votre matrice est généralement C_CONTIGOUS
(vérifiez avec matrix.flags
). Par conséquent, il copie les données pour l'alignement fortran. De plus, lors de l'exécution de la routine lapack dgesvd, une autre copie de votre matrice est nécessaire (ou au moins la mémoire correspondante). Vous pouvez vous débarrasser d'une copie si vous vous assurez que l'alignement de la mémoire est de style fortran dès le début.