Para redução do modelo, quero calcular os vetores singulares esquerdos associados aos - digamos 20 - maiores valores singulares de uma matriz , em que N ≈ 10 6 e k ≈ 10 3 . Infelizmente, minha matriz A será densa sem nenhuma estrutura.
Se eu apenas chamar a svd
rotina do numpy.linalg
módulo em Python para uma matriz aleatória desse tamanho, ocorrerá um erro de memória. Isto é devido à atribuição de para a decomposição A = V S L .
Existem algoritmos por aí que evitam essa armadilha? Por exemplo, configurando apenas os vetores singulares associados a valores singulares diferentes de zero.
Estou pronto para negociar com precisão e tempo de computação.
full_matrices
que está definida como False, para que apenas as partes 'diferentes de zero' sejam computadas. No entanto, existe uma maneira de reduzir ainda mais a computação?
numpy
back-end usa o código fortran, a LAPACKE_dgesvd
rotina para o svd padrão. No entanto, normalmente sua matriz é C_CONTIGOUS
(verifique com matrix.flags
). Portanto, ele copia os dados para o alinhamento do fortran. Além disso, durante a execução da rotina lapack dgesvd, é necessária outra cópia da sua matriz (ou pelo menos a memória). Você pode se livrar de uma cópia se certificar-se de que o alinhamento da memória seja do tipo fortran desde o início.