Linear Algebra·Unidad 9

LA-09 — SVD & matrix decompositions

La SVD es probablemente la factorización más importante en toda la ciencia de datos: funciona para cualquier matriz (no solo cuadradas o simétricas), y es el motor de PCA, compresión de imágenes, sistemas de recomendación (matrix factorization), low-rank approximation y la pseudo-inversa para least squares mal condicionados. Si dominas SVD, dominas media caja de herramientas del ML clásico.

Why this matters for ML

La SVD es probablemente la factorización más importante en toda la ciencia de datos: funciona para cualquier matriz (no solo cuadradas o simétricas), y es el motor de PCA, compresión de imágenes, sistemas de recomendación (matrix factorization), low-rank approximation y la pseudo-inversa para least squares mal condicionados. Si dominas SVD, dominas media caja de herramientas del ML clásico.

Concepts covered

  • Singular Value Decomposition A=UΣVA=U\Sigma V^\top
  • Singular values vs. eigenvalues
  • Interpretación geométrica (rotar–escalar–rotar)
  • Low-rank approximation (teorema de Eckart–Young)
  • Relación SVD ↔ eigendecomposition de AAA^\top A
  • Panorama de otras factorizaciones: LU, QR, Cholesky

Intuition first

🎬 Busca "3Blue1Brown / Visual SVD" o Steve Brunton "SVD" (serie excelente y corta). Idea: toda transformación lineal = rotación, luego escalado por ejes, luego otra rotación.

Theory & key results

SVD: cualquier ARm×nA\in\mathbb{R}^{m\times n} se factoriza como A=UΣV,A = U,\Sigma,V^\top, donde UU (m×mm\times m) y VV (n×nn\times n) son ortogonales, y Σ\Sigma (m×nm\times n) es diagonal con entradas σ1σ20\sigma_1\ge\sigma_2\ge\dots\ge0, los singular values.

  • Columnas de VV = right singular vectors (direcciones de entrada).
  • Columnas de UU = left singular vectors (direcciones de salida).
  • σi\sigma_i = cuánto se estira cada dirección.

Geometría: AxA\mathbf{x} = rota con VV^\top → escala ejes con Σ\Sigma → rota con UU. Una esfera unitaria se vuelve un elipsoide con semiejes σi\sigma_i.

Relación con eigen: los σi2\sigma_i^2 son los eigenvalues de AAA^\top A (que es simétrica PSD, LA-08), y VV son sus eigenvectors; UU son los eigenvectors de AAAA^\top. Por eso SVD "hereda" la limpieza del spectral theorem para matrices no simétricas.

Rank y estructura: el número de σi>0\sigma_i>0 = rank de AA. Singular values chiquitos = direcciones de poca "energía" (a menudo ruido).

Low-rank approximation (Eckart–Young): la mejor aproximación de rank kk a AA (en norma de Frobenius/espectral) es quedarte con los kk mayores singular values: Ak=i=1kσiuivi.A_k = \sum_{i=1}^{k}\sigma_i,\mathbf{u}_i\mathbf{v}_i^\top. Esto es compresión: guardas kk tripletes en vez de toda la matriz. Base de compresión de imágenes y de la reducción de dimensión.

Otras factorizaciones (panorama):

  • LU (A=LUA=LU): eliminación gaussiana empaquetada; para resolver sistemas rápido.
  • QR (A=QRA=QR, LA-06): least squares estable.
  • Cholesky (A=LLA=LL^\top, para PD): la más eficiente; aparece en gaussianas y optimización.

Worked example

Idea numérica: para A=[3002]A=\begin{bmatrix}3&0\0&-2\end{bmatrix}, AA=[9004]A^\top A=\begin{bmatrix}9&0\0&4\end{bmatrix} → eigenvalues 9,49,4 → singular values σ=3,2\sigma=3,2. Σ=diag(3,2)\Sigma=\text{diag}(3,2); U,VU,V son rotaciones/reflexiones que acomodan los signos. La esfera unidad se mapea a un elipsoide con semiejes 3 y 2.

Compresión intuitiva: una imagen 512×512512\times512 (262k números) reconstruida con k=50k=50 usa 50(512+512+1)5150\cdot(512+512+1)\approx 51k números — ~5× menos, casi sin pérdida visible.

Notebook exercises (by hand)

  1. Para A=[2003]A=\begin{bmatrix}2&0\0&3\end{bmatrix}, halla singular values (ya es diagonal — cuidado con signos/orden).
  2. Muestra que los singular values de AA son las raíces de los eigenvalues de AAA^\top A.
  3. Si AA es simétrica PD, ¿cómo se relacionan sus singular values con sus eigenvalues?
  4. Explica por qué descartar los σi\sigma_i pequeños "elimina ruido" y reduce dimensión.
  5. ¿Cuántos números guarda una aproximación rank-kk de una matriz m×nm\times n? Compara con mnmn.
  6. Relaciona SVD con PCA en una frase (adelanto de LA-10).

Python lab

import numpy as np

A = np.array([[3.,1.,1.],[-1.,3.,1.]])
U, s, Vt = np.linalg.svd(A, full_matrices=False)
print("singular values:", s)
# reconstrucción exacta
print("reconstruye A:", np.allclose(U @ np.diag(s) @ Vt, A))

# singular values^2 == eigenvalues de AᵀA
print(np.allclose(np.sort(s**2)[::-1],
                  np.sort(np.linalg.eigvalsh(A.T @ A))[::-1]))

# low-rank approximation
def low_rank(A, k):
    U, s, Vt = np.linalg.svd(A, full_matrices=False)
    return U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :]

B = np.random.randn(30, 20)
for k in [1, 5, 10, 20]:
    err = np.linalg.norm(B - low_rank(B, k)) / np.linalg.norm(B)
    print(f"k={k:2d}  error relativo={err:.3f}")

Reto: carga una imagen en escala de grises como matriz y compárala reconstruida con k=5,20,50k=5,20,50.

Examen final 📝

Intenta cada nivel antes de abrir las soluciones.

🟡 Medio

  1. Para A=[2003]A=\begin{bmatrix}2&0\0&-3\end{bmatrix}: da sus singular values (¡ojo con el signo!).
  2. ¿Cuántos números guarda una aproximación rank-kk de una matriz 100×80100\times80? Compara con guardar la matriz completa para k=10k=10.

🟠 Medio-difícil

  1. Muestra que los singular values de AA son las raíces cuadradas de los eigenvalues de AAA^\top A, y que VV (right singular vectors) son los eigenvectors de AAA^\top A.
  2. Si AA es simétrica positive definite, explica por qué su SVD y su eigendecomposition coinciden.

🔴 Difícil

  1. Deriva la pseudo-inversa A+=VΣ+UA^+=V\Sigma^+U^\top desde la SVD y explica cómo resuelve least squares minAxb2\min|A\mathbf x-\mathbf b|^2 incluso cuando AAA^\top A es singular (rango deficiente).
  2. Un sistema de recomendación tiene una matriz usuarios×ítems muy incompleta. Explica, usando la idea de low-rank approximation (Eckart–Young), por qué asumir "rank bajo" permite predecir ratings faltantes, y qué significa cada singular value grande en ese contexto.
✅ Soluciones
  1. Singular values son 0\ge0: σ=3,2\sigma=3,2 (no 3-3; el signo se absorbe en UU o VV).
  2. Rank-kk guarda k(m+n+1)=k(100+80+1)=181kk(m+n+1)=k(100+80+1)=181k. Para k=10k=10: 18101810 vs. 10080=8000100\cdot80=8000 ⇒ ~4.4× menos.
  3. AA=(UΣV)(UΣV)=VΣUUΣV=VΣΣV=VΣ2VA^\top A=(U\Sigma V^\top)^\top(U\Sigma V^\top)=V\Sigma^\top U^\top U\Sigma V^\top=V\Sigma^\top\Sigma V^\top=V\Sigma^2 V^\top. Es la eigendecomposition de AAA^\top A: eigenvalues σi2\sigma_i^2, eigenvectors columnas de VV.
  4. Si A=QΛQA=Q\Lambda Q^\top con Λ>0\Lambda>0, entonces ya tiene la forma UΣVU\Sigma V^\top con U=V=QU=V=Q y Σ=Λ\Sigma=\Lambda (todos positivos). Cuando hay eigenvalues negativos, SVD toma σ=λ\sigma=|\lambda| y ajusta signos en UU.
  5. A+=VΣ+UA^+=V\Sigma^+U^\top donde Σ+\Sigma^+ invierte los σi>0\sigma_i>0 y deja 0 los ceros. x^=A+b\hat{\mathbf x}=A^+\mathbf b da la solución de mínima norma de least squares; funciona con rank deficiente porque solo invierte las direcciones con σi>0\sigma_i>0 (ignora el null space, en vez de fallar como (AA)1(A^\top A)^{-1}).
  6. Si los gustos reales dependen de pocos "factores latentes" (géneros, temas), la matriz completa es aprox. de rank bajo: AUkΣkVkA\approx U_k\Sigma_k V_k^\top. Ajustar esos kk factores a las entradas conocidas permite reconstruir (predecir) las faltantes. Cada σi\sigma_i grande = un factor latente que explica mucha varianza de los ratings.