En términos muy generales, existen dos enfoques para calcular el valor propio o las descomposiciones de valores singulares. Un enfoque es diagonalizar la matriz y esto esencialmente produce la descomposición del valor propio / valor singular (todo el espectro del valor propio) al mismo tiempo, vea una descripción general aquí: ¿Cuáles son los algoritmos eficientes para calcular la descomposición del valor singular (SVD)? La alternativa es utilizar un algoritmo iterativo que produzca uno (o varios) vectores propios a la vez. Las iteraciones se pueden detener después de que se haya calculado el número deseado de vectores propios.
No creo que haya algoritmos iterativos específicamente para SVD. Esto es porque se puede calcular SVD de un matriz B haciendo una eigendecomposition de un cuadrado simétrico ( n + m ) × ( n + m ) de la matriz A = ( 0 B B ⊤ 0 ) . Por lo tanto, en lugar de preguntar qué algoritmos calculan SVD truncada, debería preguntarse qué algoritmos iterativos calculan la descomposición propia: algoritmo para SVD truncada ≈ algoritmo iterativo para descomposición propia .n × msi( n + m ) × ( n + m )
A = ( 0si⊤si0 0) .
algoritmo para SVD truncado ≈ algoritmo iterativo para descomposición propia .
El algoritmo iterativo más simple se llama iteración de potencia y de hecho es muy simple:
- X
- x ← A x
- x ← x / ∥ x ∥
- Ir al paso 2 a menos que converja.
Todos los algoritmos más complejos se basan en última instancia en la idea de iteración de potencia, pero se vuelven bastante sofisticados. Las matemáticas necesarias están dadas por los subespacios de Krylov . Los algoritmos son la iteración de Arnoldi (para matrices cuadradas no simétricas), la iteración de Lanczos (para matrices simétricas cuadradas) y variaciones de los mismos, como por ejemplo, "método de Lanczos reiniciado implícitamente" y otras cosas.
Puede encontrar esto descrito en, por ejemplo, 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, lo que sea) usan las mismas bibliotecas Fortran para realizar descomposiciones de valores propios / singulares. Estos son LAPACK y ARPACK . ARPACK significa ARnoldi PACKage, y se trata de iteraciones de Arnoldi / Lanczos. Por ejemplo, en Matlab hay dos funciones para SVD: svd
realiza una descomposición completa a través de LAPACK, y svds
calcula un número dado de vectores singulares a través de ARPACK y en realidad es solo un contenedor para una eigs
llamada en la matriz "cuadrada".
Actualizar
siUNUNsiUN
También hay 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 de valores singulares de matrices grandes y dispersas o estructuradas. Las rutinas 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 se admite de forma nativa en los lenguajes de programación estándar. Está escrito por Rasmus Larsen, que tiene una gran bidiagonalización de Lanczos en papel de 1998 de 90 páginas de largo con reortogonalización parcial con lo que parece una buena visión general. Gracias a @MichaelGrant a través de este hilo de Computational Science SE .
Entre los documentos más recientes, el más popular parece ser Baglama & Reichel, 2005, Augmented reinició implícitamente los métodos de bidiagonalización de Lanczos , lo que probablemente se encuentre en el estado del arte. Gracias a @Dougal por dar este enlace en los comentarios.
Actualización 2
De hecho, hay un enfoque completamente diferente descrito en detalle en el documento general que usted mismo citó: Halko et al. 2009, Hallazgo de estructura con aleatoriedad: algoritmos probabilísticos para construir descomposiciones matriciales aproximadas . No sé lo suficiente para comentar.