WhatsApp

  

Descomposición Espectral: Algoritmo, Teoría y Ejemplos Prácticos en Python

Aprende a implementar la descomposición espectral en Python, con ejemplos paso a paso, comparaciones con SVD, buenas prácticas, optimización y solución de problemas.

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}

  • Q es la matriz cuyas columnas son los vectores propios (eigenvectors) de A.
  • \Lambda es 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

  1. Comprobar que la matriz A sea cuadrada y, preferiblemente, simétrica (para garantizar valores propios reales).
  2. Calcular los valores propios λ_i y vectores propios v_i usando rutinas numéricas (NumPy, SciPy).
  3. Ordenar los pares (λ_i, v_i) de mayor a menor valor absoluto de λ_i (útil para reducción de dimensionalidad).
  4. Construir Q = [v_1, v_2, …, v_n] y \Lambda = diag(λ_1, λ_2, …, λ_n).
  5. Verificar la reconstrucción: A ≈ Q @ \Lambda @ Q.T (para matrices simétricas Q^{-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) por Q.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 float64 para minimizar errores de redondeo en aplicaciones críticas.
  • Limitar la precisión con np.set_printoptions(precision=4) para depuración.
  • Utilizar scipy.linalg.eigh cuando la matriz es simétrica; es más rápido que np.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.eigvals con el argumento overwrite_a=True para reducir consumo de memoria.
  • Considerar la SVD como alternativa.

7. Casos de uso reales

  1. Análisis de vibraciones: Los modos propios de una estructura se obtienen mediante la descomposición espectral de la matriz de rigidez.
  2. Google PageRank: El vector propio dominante de la matriz de transición del grafo web representa la autoridad de cada página.
  3. PCA para visión por computadora: Reducción de dimensionalidad de características de imágenes antes de entrenar clasificadores.
  4. 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 numpy y scipy que incluyen parches de vulnerabilidades de desbordamiento de búfer.

© 2025 BlogTech – Todos los derechos reservados.



Descomposición Espectral: Algoritmo, Teoría y Ejemplos Prácticos en Python
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 13 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Algoritmo para Sistemas Lineales Dispersos: Guía Completa y Ejemplos en Python
Aprende a resolver sistemas lineales dispersos con los algoritmos más eficientes, compara métodos directos e iterativos, y descubre ejemplos prácticos en Python usando SciPy y otras librerías.