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, laLAPACKE_dgesvd
rutina para svd estándar. Sin embargo, normalmente su matriz esC_CONTIGOUS
(consulte conmatrix.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.Respuestas:
Si solo desea unos pocos valores / vectores singulares, ARPACK debería hacer el truco. Los documentos SVD no son geniales, y esta distribución está más actualizada.
EDITAR: Si quieres hacer esto en python, SciPy tiene un contenedor . Como su matriz es densa, puede probar el formato de fila dispersa de bloque (BSR).
fuente
Eche un vistazo a sklearn.decomposition.TruncatedSVD en scikit-learn 0.14-rc.
(Creo que la gente de scikit-learn sigue stackoverflow.com/questions/tagged/scikit-learn , así que haría preguntas detalladas allí).
(¿Cuánta memoria tienes? 10 dobles ya es 8G.)6+3
fuente
Quizás puedas probar esto.
https://github.com/jakevdp/pypropack
Este es un contenedor de Python para el paquete PROPACK, que implementa descomposiciones de valores singulares parciales eficientes de matrices dispersas grandes y operadores lineales.
fuente
Intel MKL implementa el nuevo algoritmo Jacobi-SVD. Aquí están los detalles de implementación: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf
Y la rutina LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1
El tamaño del trabajo es, por supuesto, ajustable. Puede llamar a las funciones C desde Python fácilmente usando Cython, SWIG o cualquier otro mecanismo de ajuste.
fuente