Decomposição em Valores Singulares
avancado machine-learning, computacao-cientifica, computacao-grafica algebra-linearDecomposiçã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
| Quantidade | Leitura na SVD |
|---|---|
| Posto | Nú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 coluna | Primeiras $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=Truesem 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
- Lloyd N. Trefethen; David Bau III (1997). Numerical Linear Algebra. SIAM.
- Gilbert Strang (2016). Introduction to Linear Algebra. Wellesley-Cambridge Press.
- Gene H. Golub; Charles F. Van Loan (2013). Matrix Computations. Johns Hopkins University Press.