Decomposição em Valores Singulares

avancado machine-learning, computacao-cientifica, computacao-grafica algebra-linear

Decomposição em Valores Singulares

A SVD é a fatoração mais informativa da álgebra linear. Ela existe para toda matriz — quadrada ou não, singular ou não — e revela posto, condicionamento, subespaços fundamentais e a melhor aproximação de posto baixo.

Se você só puder aprender uma decomposição, aprenda esta.

Enunciado

Toda $A \in \mathbb{R}^{m\times n}$ se fatora como

$$A = U\Sigma V^T$$

com:

  • $U \in \mathbb{R}^{m\times m}$ ortogonal — vetores singulares à esquerda;
  • $\Sigma \in \mathbb{R}^{m\times n}$ diagonal com $\sigma_1 \ge \sigma_2 \ge \cdots \ge 0$ — valores singulares;
  • $V \in \mathbb{R}^{n\times n}$ ortogonal — vetores singulares à direita.

Os valores singulares são as raízes quadradas dos autovalores de $A^TA$, e são sempre reais e não negativos.

Interpretação geométrica

Toda transformação linear é a composição de três etapas: uma rotação, um escalonamento ao longo dos eixos, outra rotação.

$V^T$ gira o espaço de entrada até alinhar com as direções principais; $\Sigma$ estica cada eixo pelo respectivo $\sigma_i$; $U$ gira o resultado para o espaço de saída. A imagem da esfera unitária por $A$ é sempre um elipsoide cujos semieixos têm comprimentos $\sigma_i$.

Essa é a razão de a SVD revelar tanto: ela separa "o quanto" a transformação estica de "para onde" ela aponta.

O que a SVD revela

QuantidadeLeitura na SVD
PostoNúmero de $\sigma_i > 0$
$|A|_2$$\sigma_1$
$|A|_F$$\sqrt{\sum \sigma_i^2}$
$\kappa_2(A)$$\sigma_1/\sigma_r$
Espaço colunaPrimeiras $r$ colunas de $U$
Espaço nuloÚltimas $n-r$ colunas de $V$

Determinar posto numericamente é justamente onde a SVD é insubstituível: em vez de perguntar quais $\sigma_i$ são exatamente zero, conta-se quantos estão acima de uma tolerância. Isso dá o posto numérico, que é a única noção utilizável em ponto flutuante.

Aproximação de posto baixo

Escrevendo a SVD como soma de matrizes de posto 1:

$$A = \sum_{i=1}^{r} \sigma_i u_i v_i^T$$

e truncando nos $k$ primeiros termos obtém-se $A_k$. O teorema de Eckart-Young garante que $A_k$ é a melhor aproximação de posto $k$, tanto na norma 2 quanto na de Frobenius:

$$|A - A_k|2 = \sigma{k+1}$$

Este é um dos resultados mais úteis da matemática aplicada: ele diz não apenas que existe boa aproximação, mas que a SVD a encontra, e quanto erro ela comete.

O ganho de armazenamento é direto: em vez de $mn$ números, guardam-se $k(m+n+1)$.

import numpy as np

U, s, Vt = np.linalg.svd(A, full_matrices=False)
k = 50
A_k = (U[:, :k] * s[:k]) @ Vt[:k, :]
erro_relativo = s[k] / s[0]

Pseudoinversa

$$A^+ = V\Sigma^+U^T$$

com $\Sigma^+$ obtida invertendo os valores singulares não nulos e transpondo.

A pseudoinversa dá a solução de norma mínima entre as que minimizam $|Ax-b|$ — resolvendo simultaneamente os casos sobredeterminado e subdeterminado, e funcionando mesmo com $A$ singular.

Na prática, valores singulares muito pequenos são zerados antes da inversão (o parâmetro rcond), evitando que ruído seja amplificado por $1/\sigma$ com $\sigma$ minúsculo. Essa regularização por truncamento é a forma mais simples de lidar com problemas mal-postos.

Relação com PCA

Centralize os dados na matriz $X$ (amostras nas linhas). Então:

  • A matriz de covariância é $\frac{1}{n-1}X^TX$.
  • Os componentes principais são as colunas de $V$.
  • A variância explicada pelo $i$-ésimo componente é $\sigma_i^2/(n-1)$.

Calcular PCA pela SVD de $X$ é preferível a calcular autovalores de $X^TX$: evita formar o produto, que eleva o condicionamento ao quadrado, e é mais estável.

Aplicações em computação

Compressão de imagens. Aplicar SVD a uma imagem e reter poucos termos produz compressão com degradação previsível. Não compete com JPEG na prática, mas é a demonstração mais clara do teorema de Eckart-Young.

Sistemas de recomendação. A fatoração da matriz usuário-item em fatores latentes é a base da filtragem colaborativa. Como a matriz real é esparsa e incompleta, usa-se SVD truncada com otimização (mínimos quadrados alternados) em vez da SVD exata.

Análise semântica latente. Aplicar SVD à matriz termo-documento revela tópicos como direções no espaço reduzido, agrupando sinônimos.

Remoção de ruído. Se o sinal está num subespaço de dimensão baixa e o ruído é espalhado, truncar a SVD limpa o dado.

Visão computacional. Estimativa de matriz fundamental, alinhamento de nuvens de pontos (algoritmo de Kabsch) e reconstrução 3D usam SVD para resolver sistemas homogêneos: a solução é o vetor singular associado ao menor valor singular.

Diagnóstico numérico. Antes de confiar em qualquer resultado de sistema linear, olhe o espectro de valores singulares. Uma queda abrupta indica posto deficiente; um decaimento suave até valores minúsculos indica mau condicionamento.

Exemplo trabalhado

$$A = \begin{pmatrix} 3 & 0 \ 0 & 2 \ 0 & 0 \end{pmatrix}$$

Já está em forma diagonal, então $\sigma_1 = 3$, $\sigma_2 = 2$, com $U$ e $V$ essencialmente identidades.

Daí: posto $2$, $|A|_2 = 3$, $|A|_F = \sqrt{13}$, $\kappa_2 = 3/2$. A melhor aproximação de posto 1 é a matriz com apenas o $3$, cometendo erro $|A - A_1|_2 = \sigma_2 = 2$.

Erros comuns

  • Usar full_matrices=True sem necessidade, alocando uma $U$ de $m\times m$ com $m$ enorme.
  • Não centralizar os dados antes de aplicar SVD para PCA — o primeiro componente vira a média.
  • Calcular SVD completa quando só se quer os maiores valores singulares; use métodos truncados (scipy.sparse.linalg.svds) ou aleatorizados.
  • Confundir vetores singulares com autovetores. Coincidem apenas para matrizes simétricas definidas positivas.
  • Esquecer o sinal. Vetores singulares são definidos a menos de sinal, e resultados podem diferir entre bibliotecas.

Leituras recomendadas

  • Trefethen e Bau, lições 4 a 5 — a melhor introdução curta à SVD, com a interpretação geométrica bem construída.
  • Strang, capítulo 7 — SVD com aplicações e muita intuição.
  • Golub e Van Loan, capítulo 8 — algoritmos de cálculo da SVD.
  • Halko, Martinsson e Tropp, "Finding Structure with Randomness" — SVD aleatorizada, o método prático para matrizes muito grandes.

Lloyd N. Trefethen and David Bau III (1997). Numerical Linear Algebra. SIAM. DOI: 10.1137/1.9780898719574. Gilbert Strang (2016). Introduction to Linear Algebra. Wellesley-Cambridge Press. ISBN 9780980232776. Gene H. Golub and Charles F. Van Loan (2013). Matrix Computations. Johns Hopkins University Press. DOI: 10.56021/9781421407944.

Referências

  1. Lloyd N. Trefethen; David Bau III (1997). Numerical Linear Algebra. SIAM.
  2. Gilbert Strang (2016). Introduction to Linear Algebra. Wellesley-Cambridge Press.
  3. Gene H. Golub; Charles F. Van Loan (2013). Matrix Computations. Johns Hopkins University Press.