WhatsApp

  

Algoritmos para Matrices Positivas Definidas y Ejemplos Prácticos en Python

Guía completa sobre matrices positivas definidas, su teoría, algoritmos de detección y generación, y ejemplos de implementación en Python con NumPy y SciPy.

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) / 2 para 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_factor con check_finite=False y 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

  1. Kernel de Máquinas de Vectores de Soporte (SVM): la matriz de kernel debe ser PD para garantizar convexidad del problema de optimización.
  2. 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.
  3. 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 Diffusion pueden 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.

© 2025 BlogTech – Todos los derechos reservados.



Algoritmos para Matrices Positivas Definidas 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 de Matrices Ortogonales: Conceptos, Implementación y Ejemplos en Python
Guía completa sobre matrices ortogonales, sus propiedades, algoritmos de generación (Gram‑Schmidt, QR, Householder) y ejemplos prácticos en Python con NumPy y SciPy.