Descomposición Espectral: Algoritmo, Teoría y Ejemplos en Python
1. ¿Qué es la descomposición espectral?
La descomposición espectral (o eigen‑decomposition) consiste en expresar una matriz cuadrada A como:
A = Q \Lambda Q^{-1}
Qes la matriz cuyas columnas son los vectores propios (eigenvectors) deA.\Lambdaes una matriz diagonal que contiene los valores propios (eigenvalues) correspondientes.
Esta representación permite analizar la estructura interna de la matriz, facilitar la solución de sistemas lineales, y es la base de técnicas como el Análisis de Componentes Principales (PCA).
2. Algoritmo paso a paso
- Comprobar que la matriz
Asea cuadrada y, preferiblemente, simétrica (para garantizar valores propios reales). - Calcular los valores propios
λ_iy vectores propiosv_iusando rutinas numéricas (NumPy, SciPy). - Ordenar los pares
(λ_i, v_i)de mayor a menor valor absoluto deλ_i(útil para reducción de dimensionalidad). - Construir
Q = [v_1, v_2, …, v_n]y\Lambda = diag(λ_1, λ_2, …, λ_n). - Verificar la reconstrucción:
A ≈ Q @ \Lambda @ Q.T(para matrices simétricasQ^{-1}=Q.T).
3. Implementación práctica en Python
import numpy as np
# Matriz de ejemplo (simétrica)
A = np.array([[4, 1, 2],
[1, 3, 0],
[2, 0, 5]], dtype=float)
# 1️⃣ Cálculo de valores y vectores propios
eig_vals, eig_vecs = np.linalg.eig(A)
# 2️⃣ Ordenar por valor absoluto descendente
idx = np.argsort(np.abs(eig_vals))[::-1]
lam = np.diag(eig_vals[idx])
Q = eig_vecs[:, idx]
# 3️⃣ Reconstrucción y validación
A_recon = Q @ lam @ np.linalg.inv(Q)
print('Reconstruction error:', np.linalg.norm(A - A_recon))
# 4️⃣ Uso en PCA (reducción a 2 dimensiones)
X = np.random.randn(100, 3) # datos ficticios
cov = np.cov(X, rowvar=False) # matriz de covarianza
vals, vecs = np.linalg.eig(cov)
proj = X @ vecs[:, :2] # proyección a los 2 componentes principales
print('Shape de la proyección:', proj.shape)
En matrices simétricas, Q.inv() se puede sustituir por Q.T, lo que reduce el coste computacional y mejora la estabilidad numérica.
4. Comparativa con la descomposición en valores singulares (SVD)
Descomposición espectral (Eigen‑Decomposition)
- Requiere que la matriz sea cuadrada.
- Ideal para matrices simétricas o hermitianas.
- Los valores propios pueden ser negativos o complejos.
- Uso directo en PCA, análisis de estabilidad y ecuaciones diferenciales.
Descomposición en valores singulares (SVD)
- Aplica a cualquier matriz
M (m×n), cuadrada o no. - Siempre produce valores singulares no negativos.
- Mayor robustez frente a matrices mal condicionadas.
- Base de algoritmos de recomendación, compresión de imágenes y reducción de dimensionalidad general.
En la práctica, para matrices simétricas la SVD y la descomposición espectral son equivalentes (A = U Σ Uᵀ ≈ Q Λ Qᵀ), pero la SVD suele ser más estable numéricamente.
5. Buenas prácticas y optimización
- Usar matrices simétricas siempre que sea posible; permite sustituir
inv(Q)porQ.T. - Escalar los datos (media 0, varianza 1) antes de aplicar la descomposición; mejora la precisión de los valores propios.
- Trabajar con tipos de dato
float64para minimizar errores de redondeo en aplicaciones críticas. - Limitar la precisión con
np.set_printoptions(precision=4)para depuración. - Utilizar
scipy.linalg.eighcuando la matriz es simétrica; es más rápido quenp.linalg.eig.
from scipy.linalg import eigh
# Matriz simétrica
vals, vecs = eigh(A) # algoritmo especializado para matrices hermitianas
6. Solución de problemas comunes
6.1. Valores propios complejos inesperados
Ocurre cuando la matriz no es simétrica o hermítica. Solución:
- Verificar la simetría:
np.allclose(A, A.T). - Si la asimetría es por ruido numérico, forzar la simetría:
A = (A + A.T) / 2.
6.2. Matriz mal condicionada
Los valores propios pueden perder precisión. Estrategias:
- Aplicar
np.linalg.cond(A)para medir la condición. - Usar
scipy.linalg.eigvalscon el argumentooverwrite_a=Truepara reducir consumo de memoria. - Considerar la SVD como alternativa.
7. Casos de uso reales
- Análisis de vibraciones: Los modos propios de una estructura se obtienen mediante la descomposición espectral de la matriz de rigidez.
- Google PageRank: El vector propio dominante de la matriz de transición del grafo web representa la autoridad de cada página.
- PCA para visión por computadora: Reducción de dimensionalidad de características de imágenes antes de entrenar clasificadores.
- Modelado de sistemas dinámicos: Solución de ecuaciones diferenciales lineales usando exponenciales de matrices (requiere eigen‑decomposition).
8. Rendimiento y escalabilidad
Para matrices grandes (n > 10,000) la descomposición completa es prohibitiva (O(n³)). Estrategias:
- Algoritmos de subespacio (ARPACK, implementado en
scipy.sparse.linalg.eigsh) para obtener sólo los k valores propios más grandes. - Representación dispersa (
scipy.sparse) para reducir consumo de memoria. - Ejemplo de cálculo de los 5 mayores valores propios:
from scipy.sparse import csr_matrix
from scipy.sparse.linalg import eigsh
# Matriz dispersa de 10000×10000
A_sparse = csr_matrix(np.random.rand(10000, 10000))
# Solo los 5 valores propios mayores
vals, vecs = eigsh(A_sparse, k=5, which='LM')
print(vals)
Esto permite aplicar la descomposición espectral en entornos de Big Data y aprendizaje automático a gran escala.
9. Seguridad y consideraciones de entorno
- Ejecutar código que carga datos externos dentro de entornos aislados (Docker/Podman) para evitar ejecución de código malicioso.
- Validar la dimensión y tipo de los datos antes de la descomposición para prevenir ataques de denegación de servicio (DoS) por matrices extremadamente grandes.
- Usar versiones actualizadas de
numpyyscipyque incluyen parches de vulnerabilidades de desbordamiento de búfer.
Descomposición Espectral: Algoritmo, Teoría y Ejemplos Prácticos en Python