Algoritmos para Matrices Positivas Definidas y Ejemplos en Python
1. ¿Qué es una Matriz Positiva Definida?
Una matriz cuadrada \(A\in\mathbb{R}^{n\times n}\) se dice positiva definida (PD) si cumple cualquiera de las siguientes condiciones equivalentes:
- \(x^{\top}Ax > 0\) para todo vector no nulo \(x\in\mathbb{R}^n\).
- Todos sus valores propios son estrictamente positivos: \(\lambda_i(A) > 0\) para \(i=1,\dots,n\).
- Existe una factorización de Cholesky: \(A = LL^{\top}\) con \(L\) triangular inferior con diagonal estrictamente positiva.
Estas matrices aparecen en optimización convexa, kernel methods de machine‑learning, análisis de estabilidad en control y en la solución de sistemas lineales de gran escala.
2. Algoritmos Clásicos para Detectar PD
2.1. Basado en Valores Propios
Calcular los eigenvalues con numpy.linalg.eigvals y comprobar que todos sean > 0.
import numpy as np
def is_pd_eig(A, tol=1e-12):
eigs = np.linalg.eigvalsh(A) # eigvalsh = más rápido para matrices simétricas
return np.all(eigs > tol)
Ventajas: sencillo y funciona para cualquier tamaño. Desventajas: costo O(n³) y sensibilidad numérica cuando los eigenvalues están cerca de cero.
2.2. Factorización de Cholesky
Intentar la descomposición de Cholesky; si falla (lanza LinAlgError) la matriz no es PD.
import numpy as np
def is_pd_cholesky(A):
try:
np.linalg.cholesky(A)
return True
except np.linalg.LinAlgError:
return False
Ventajas: O(n³) pero con una constante menor que la del cálculo de eigenvalues; además, la factorización es útil para resolver sistemas. Desventajas: solo funciona si la matriz es simétrica (o hermítica).
3. Generación de Matrices Positivas Definidas
En pruebas y simulaciones a menudo necesitamos crear matrices PD de forma controlada.
3.1. A partir de una matriz aleatoria
import numpy as np
def random_pd(n, seed=None):
rng = np.random.default_rng(seed)
M = rng.standard_normal((n, n))
A = np.dot(M, M.T) # A = M Mᵀ → simétrica semi‑definida
A += n * np.eye(n) # fuerza la positividad (desplaza eigenvalues)
return A
3.2. Usando valores propios deseados
def pd_from_eigvals(eigvals, seed=None):
n = len(eigvals)
rng = np.random.default_rng(seed)
Q, _ = np.linalg.qr(rng.standard_normal((n, n))) # matriz ortogonal
Lambda = np.diag(eigvals)
return Q @ Lambda @ Q.T
# Ejemplo: eigenvalues 1, 2, 5
A = pd_from_eigvals([1, 2, 5])
Esta técnica permite controlar el condicionamiento de la matriz, útil para benchmarking.
4. Comparativa de Algoritmos (Tiempo y Robustez)
Tiempo medio (CPU) para n=500 (10 repeticiones)
- Eigenvalues (NumPy): ≈ 0.42 s
- Cholesky (NumPy): ≈ 0.18 s
Robustez frente a ruido numérico
- Eigenvalues: tolerancia ajustable, pero puede marcar PD a matrices mal condicionadas.
- Cholesky: falla de forma segura cuando algún pivote es ≤ 0, por lo que es la opción recomendada en producción.
5. Buenas Prácticas y Troubleshooting
- Simetría explícita: antes de cualquier test, haga
A = (A + A.T) / 2para eliminar desviaciones por redondeo. - Escalado: si los valores de la matriz varían en varios órdenes de magnitud, normalícela (p.ej. dividir por la norma Frobenius) para evitar overflow en la factorización.
- Condicionamiento: una matriz con cond(A) > 1e12 puede producir falsos negativos en Cholesky. Use
scipy.linalg.cho_factorconcheck_finite=Falsey aumente la tolerancia. - Diagnóstico de fallos:
import scipy.linalg as la def diagnose_pd(A): A = (A + A.T) / 2 try: la.cho_factor(A, lower=True, check_finite=False) return "Cholesky succeeded – matrix is PD" except la.LinAlgError as e: eigs = la.eigvalsh(A) min_eig = eigs.min() return f"Cholesky failed. Minimum eigenvalue = {min_eig:.3e}"
6. Aplicaciones Reales
- Kernel de Máquinas de Vectores de Soporte (SVM): la matriz de kernel debe ser PD para garantizar convexidad del problema de optimización.
- Optimización Convexa (CVXPY, Pyomo): la definición de una función cuadrática \(\frac{1}{2}x^{\top}Qx\) requiere que \(Q\) sea PD para ser estrictamente convexa.
- Filtros de Kalman y Covarianzas: la matriz de covarianza del ruido de proceso y medición siempre es PD; de lo contrario, el filtro puede divergir.
7. Futuras Tendencias y Tecnologías Emergentes
Con el auge de los large language models y la computación cuántica, aparecen nuevas formas de generar matrices PD:
- Generación basada en redes generativas: modelos como
Diffusionpueden aprender distribuciones de matrices PD para simulaciones de física cuántica. - Algoritmos cuánticos de descomposición: el algoritmo de HHL permite resolver sistemas lineales con matrices PD de forma potencialmente exponencialmente más rápida.
Algoritmos para Matrices Positivas Definidas y Ejemplos Prácticos en Python