A grandes rasgos, existen dos métodos para calcular los valores propios o las descomposiciones de valores singulares. Un enfoque consiste en diagonalizar la matriz y esto produce esencialmente toda la descomposición de valores propios / valores singulares (todo el espectro de valores propios) al mismo tiempo: ¿Cuáles son los algoritmos eficaces para calcular la descomposición en valores singulares (SVD)? La alternativa es utilizar un algoritmo iterativo que produzca uno (o varios) vectores propios cada vez. Las iteraciones pueden detenerse una vez calculado el número deseado de vectores propios.
No creo que existan algoritmos iterativos específicos para SVD. Esto se debe a que uno puede calcular la SVD de un $n\times m$ matriz $\mathbf B$ haciendo una eigendecomposición de un cuadrado simétrico $(n+m)\times(n+m)$ matriz $$\mathbf A=\left(\begin{array}{cc}0 & \mathbf B\\\mathbf B^\top & 0\end{array}\right).$$ Por lo tanto, en lugar de preguntar qué algoritmos calculan la SVD truncada, deberías preguntar qué algoritmos iterativos calculan la eigendecomposición: $$\text{algorithm for truncated SVD} \approx \text{iterative algorithm for eigendecomposition}.$$
El algoritmo iterativo más sencillo se denomina iteración de potencia y es muy sencillo:
- Inicializar aleatorio $\mathbf x$ .
- Actualización $\mathbf x \gets \mathbf A\mathbf x$ .
- Normalizar $\mathbf x \gets \mathbf x / \|\mathbf x\|$ .
- Pasar al paso nº 2 a menos que haya convergencia.
Todos los algoritmos más complejos se basan en última instancia en la idea de la iteración de potencia, pero se vuelven bastante sofisticados. La matemática necesaria viene dada por Subespacios de Krylov . Los algoritmos son Iteración Arnoldi (para matrices cuadradas no simétricas), Iteración de Lanczos (para matrices simétricas cuadradas), y sus variaciones como, por ejemplo, "método de Lanczos reiniciado implícitamente" y otros.
Esto se describe, por ejemplo, en los siguientes libros de texto:
- Golub & Van Loan, Cálculos matriciales
- Trefethen & Bau, Álgebra lineal numérica
- Demmel, Álgebra lineal numérica aplicada
- Saad, Métodos numéricos para grandes problemas de valores propios
Todos los lenguajes de programación y paquetes estadísticos razonables (Matlab, R, Python numpy, etc.) utilizan las mismas bibliotecas Fortran para realizar descomposiciones de valores propios/singulares. Éstas son LAPACK y ARPACK . ARPACK son las siglas de ARnoldi PACKage, y se trata de iteraciones Arnoldi/Lanczos. Por ejemplo, en Matlab hay dos funciones para SVD: svd
realiza la descomposición completa mediante LAPACK, y svds
calcula un número determinado de vectores singulares a través de ARPACK y en realidad no es más que una envoltura para un eigs
en la matriz "cuadrada".
Actualización
Resulta que hay variantes del algoritmo de Lanczos que están específicamente adaptadas para realizar la SVD de una matriz rectangular $\mathbf B$ sin construir explícitamente una matriz cuadrada $\mathbf A$ primero. El término central aquí es Bidiagonalización de Lanczos ; según tengo entendido, se trata esencialmente de un truco para realizar todos los pasos de las iteraciones de Lanczos sobre $\mathbf A$ directamente en $\mathbf B$ sin llegar a construir $\mathbf A$ y ahorrar así espacio y tiempo.
También existe una biblioteca Fortran para estos métodos, se llama PROPACK :
El paquete de software PROPACK contiene un conjunto de funciones para calcular la descomposición del valor singular de matrices grandes y dispersas o estructuradas. Las rutinas de SVD se basan en el algoritmo de bidiagonalización de Lanczos con reortogonalización parcial (BPRO).
Sin embargo, PROPACK parece ser mucho menos estándar que ARPACK y no está soportado de forma nativa en los lenguajes de programación estándar. Está escrito por Rasmus Larsen, que tiene un extenso artículo de 90 páginas publicado en 1998. Bidiagonalización de Lanczos con reortogonalización parcial con lo que parece una buena visión de conjunto. Gracias a @MichaelGrant vía este hilo sobre Ciencias Computacionales SE .
Entre los trabajos más recientes, el más popular parece ser Baglama & Reichel, 2005, Métodos de bidiagonalización de Lanczos aumentados y reiniciados implícitamente que probablemente esté en la vanguardia de la tecnología. Gracias a @Dougal para dar este enlace en los comentarios.
Actualización 2
De hecho, existe un enfoque totalmente diferente descrito en detalle en el documento de síntesis que usted mismo ha citado: Halko et al. 2009, Encontrar estructura con aleatoriedad: Algoritmos probabilísticos para construir descomposiciones matriciales aproximadas . No sé lo suficiente como para hacer comentarios.