De um modo geral, existem duas abordagens para calcular decomposições de autovalores ou valores singulares. Uma abordagem é diagonalizar a matriz e isso essencialmente produz a decomposição de todo o valor próprio / valor singular (todo o espectro de valor próprio) ao mesmo tempo, veja algumas visões gerais aqui: Quais são os algoritmos eficientes para calcular a decomposição de valor singular (SVD)? A alternativa é usar um algoritmo iterativo que produz um (ou vários) vetores próprios por vez. As iterações podem ser interrompidas após o número desejado de vetores próprios ter sido calculado.
Eu não acho que existem algoritmos iterativos especificamente para SVD. Isto é porque se pode calcular SVD de um matriz B , efectuando uma eigendecomposition de um simétrica quadrado ( n + m ) x ( n + m ) de matriz Um = ( 0 B B ⊤ 0 ) . Portanto, em vez de perguntar o que algoritmos de computação truncada SVD, você deve estar se perguntando o que iterativa algoritmos de computação eigendecomposition: algoritmo para truncada SVD ≈ iterativo algoritmo para eigendecomposition .n × mB( n + m ) × ( n + m )
A = ( 0B⊤B0 0) .
algoritmo para truncada SVD ≈ iterativo algoritmo para eigendecomposition .
O algoritmo iterativo mais simples é chamado de iteração de energia e é realmente muito simples:
- Inicialize aleatório .x
- Atualizar .x ← A x
- Normalize .x ← x / ∥ x ∥
- Vá para a etapa 2, a menos que esteja convergindo.
Todos os algoritmos mais complexos são baseados na idéia de iteração de energia, mas ficam bastante sofisticados. A matemática necessária é dada pelos subespaços de Krylov . Os algoritmos são iteração de Arnoldi (para matrizes quadradas não simétricas), iteração de Lanczos (para matrizes quadradas simétricas) e variações dos mesmos, como, por exemplo, "método Lanczos reiniciado implicitamente" e outros enfeites.
Você pode encontrar isso descrito em, por exemplo, os seguintes livros:
- Golub e Van Loan, Matrix Computations
- Trefethen & Bau, Álgebra Linear Numérica
- Demmel, Álgebra Linear Numérica Aplicada
- Saad, métodos numéricos para grandes problemas de autovalor
Todas as linguagens de programação razoáveis e pacotes estatísticos (Matlab, R, Python numpy, o nome dele) usam as mesmas bibliotecas Fortran para executar decomposições de valor próprio / singular. Esses são LAPACK e o ARPACK . ARPACK significa ARnoldi PACKage, e é sobre iterações de Arnoldi / Lanczos. Por exemplo, no Matlab, existem duas funções para o SVD: svd
executa decomposição completa via LAPACK e svds
calcula um determinado número de vetores singulares via ARPACK e, na verdade, é apenas um invólucro para uma eigs
chamada na matriz "de tamanho quadrado".
Atualizar
Acontece que existem variantes do algoritmo de Lanczos que são especificamente adaptadas para executar SVD de uma matriz retangular sem construir explicitamente uma matriz quadrada primeiro. O termo central aqui é bidiagonalização de Lanczos ; pelo que entendi, é essencialmente um truque para executar todas as etapas das iterações de Lanczos emBUMAUMA diretamente no sem nunca construir o e, assim, economizar espaço e tempo.BUMA
Também existe uma biblioteca Fortran para esses métodos, chamada PROPACK :
O pacote de software PROPACK contém um conjunto de funções para calcular a decomposição de valor singular de matrizes grandes e esparsas ou estruturadas. As rotinas SVD são baseadas no algoritmo de bidiagonalização de Lanczos com re-regionalização parcial (BPRO).
No entanto, o PROPACK parece ser muito menos padrão que o ARPACK e não é suportado nativamente nas linguagens de programação padrão. Foi escrito por Rasmus Larsen, que possui um grande artigo de 90 páginas sobre o texto de Lanczos bidiagonalização, com re - regionalização parcial, com o que parece uma boa visão geral. Graças a @MichaelGrant através deste tópico SE da Computational Science .
Entre os trabalhos mais recentes, o mais popular parece ser Baglama & Reichel, 2005, aumentado implicitamente reiniciado os métodos de bidiagonalização de Lanczos , que provavelmente está em torno do estado da arte. Obrigado a @Dougal por fornecer este link nos comentários.
Atualização 2
De fato, há uma abordagem totalmente diferente descrita em detalhes no documento de visão geral que você citou: Halko et al. 2009, Encontrando estrutura com aleatoriedade: algoritmos probabilísticos para a construção de decomposições matriciais aproximadas . Não sei o suficiente para comentar.