Para la reducción del modelo, quiero calcular los vectores singulares izquierdos asociados a los - digamos 20 - valores singulares más grandes de una matriz , donde y . Desafortunadamente, mi matriz será densa sin ninguna estructura. N ≈ 10 6 k ≈ 10 3 A
Si solo llamo a la svd
rutina desde el numpy.linalg
módulo en Python para una matriz aleatoria de este tamaño, me encuentro con un error de memoria. Esto se debe a la asignación de para la descomposición . A = V S U
¿Existen algoritmos que eviten esta trampa? Por ejemplo, configurando solo los vectores singulares asociados con valores singulares distintos de cero.
Estoy listo para comerciar en tiempo de cálculo y precisión.
full_matrices
establecerse en False para que solo se calculen las partes 'distintas de cero'. Sin embargo, ¿hay alguna manera de reducir el cálculo aún más?
numpy
backend usa código fortran, la LAPACKE_dgesvd
rutina para svd estándar. Sin embargo, normalmente su matriz es C_CONTIGOUS
(consulte con matrix.flags
). Por lo tanto, copia los datos para una alineación fortran. Además, mientras se ejecuta la rutina dsvd de lapack, se necesita otra copia de su matriz (o al menos la memoria para ello). Puede deshacerse de una copia si se asegura de que la alineación de la memoria es para un estilo desde el principio.