Valores Propios y Vectores Propios: Algoritmo y Ejemplos en Python
Entiende la teoría, descubre los algoritmos más usados y aprende a implementarlos con código listo para producción.
1. Conceptos Básicos
Para una matriz cuadrada A \in \mathbb{R}^{n\times n}, un valor propio λ y su vector propio v cumplen:
A·v = λ·v
Estos conceptos son la columna vertebral de técnicas como PCA, estabilidad de sistemas dinámicos y métodos numéricos.
2. Algoritmos Clásicos
Power Iteration
- Ideal para obtener el valor propio dominante (de mayor magnitud).
- Iterativo:
v_{k+1}=A·v_k / \|A·v_k\|. - Convergencia lineal, sensible a valores propios cercanos en magnitud.
- Uso típico en PageRank y métodos de clustering.
Algoritmo QR
- Descompone
A = Q·R(Q ortogonal, R triangular superior). - Repite
A_{k+1}=R_k·Q_khasta queA_ksea casi triangular. - Obtiene todos los valores propios simultáneamente.
- Convergencia cuadrática con shift y versiones Hessenberg.
En la práctica, la mayoría de los desarrolladores usan numpy.linalg.eig o scipy.linalg.eig, que implementan versiones optimizadas del algoritmo QR con técnicas de reducción a Hessenberg.
3. Implementación en Python
3.1. Usando NumPy (una línea)
import numpy as np
A = np.array([[4, 2], [1, 3]])
values, vectors = np.linalg.eig(A)
print('Valores propios:', values)
print('Vectores propios:\n', vectors)
3.2. Power Iteration paso a paso
import numpy as np
def power_iteration(A, num_iters=1000, tol=1e-10):
n, _ = A.shape
b_k = np.random.rand(n)
b_k = b_k / np.linalg.norm(b_k)
for _ in range(num_iters):
b_k1 = A @ b_k
b_k1_norm = np.linalg.norm(b_k1)
b_k_next = b_k1 / b_k1_norm
if np.linalg.norm(b_k_next - b_k) < tol:
break
b_k = b_k_next
eigenvalue = b_k.T @ A @ b_k
return eigenvalue, b_k
A = np.array([[2, 1], [1, 2]])
λ, v = power_iteration(A)
print('Valor propio dominante:', λ)
print('Vector propio asociado:', v)
3.3. Algoritmo QR con SciPy
import numpy as np
from scipy.linalg import eig
A = np.array([[6, 2, 1], [2, 3, 1], [1, 1, 1]])
values, vectors = eig(A)
print('Valores propios (complejos):', values)
print('Vectores propios (columnas):')
print(vectors)
4. Comparativa de Métodos
Ventajas
- NumPy / SciPy: Muy rápido (BLAS/LAPACK), manejo automático de matrices complejas.
- Power Iteration: Memoria mínima, ideal para matrices extremadamente grandes y dispersas.
- QR: Obtiene todo el espectro, robusto frente a valores propios cercanos.
Desventajas
- NumPy / SciPy: Requiere que la matriz quepa en RAM.
- Power Iteration: Sólo el valor dominante, converge lentamente si el gap espectral es pequeño.
- QR: Costoso O(n³) y necesita transformación a Hessenberg para matrices grandes.
5. Buenas Prácticas y Optimización
- Pre‑escalado: Normaliza la matriz (por ejemplo, divide por su norma) para evitar desbordamientos numéricos.
- Uso de tipos
float64: Garantiza precisión suficiente para la mayoría de los problemas de ingeniería. - Matrices dispersas: Emplea
scipy.sparse.linalg.eigsoeigsh(solo valores reales) que implementan Lanczos/Arnoldi. - Selección de shift en QR: Mejora la convergencia, especialmente para valores propios interiores.
- Verificación de ortogonalidad: Después de obtener los vectores, comprueba
V.T @ V ≈ I.
6. Solución de Problemas Comunes
6.1. Valores propios complejos inesperados
Si tu matriz es real pero obtienes valores complejos, verifica que no sea simétrica indefinida o que la precisión numérica no esté introduciendo pequeñas componentes imaginarias. Usa np.real_if_close para limpiar.
6.2. Convergencia lenta en Power Iteration
Reduce el ratio |λ₂/λ₁| aplicando un shift (A - μI) o emplea inverse iteration para valores internos.
6.3. Memoria insuficiente al usar numpy.linalg.eig
Para matrices > 10 000×10 000, migra a scipy.sparse.linalg.eigs o a paquetes como ARPACK integrados en SciPy.
7. Casos de Uso del Mundo Real
- Análisis de Componentes Principales (PCA): Descomposición espectral de la matriz de covarianza para reducción dimensional.
- Stability analysis en control: Los polos del sistema son los valores propios del matrix A en
dx/dt = A·x. - Recomendadores (PageRank): El vector propio dominante del grafo de enlaces representa la autoridad de cada página.
- Modelado de vibraciones mecánicas: Frecuencias naturales obtenidas de los valores propios del sistema masa‑resorte.
Algoritmo de Valores Propios y Vectores Propios: Conceptos, Implementación y Ejemplos en Python