Saltar al contenido

Averigüe si la matriz es definida positiva con numpy

Esta noticia fue aprobado por expertos así aseguramos la exactitud de nuestro tutorial.

Solución:

También puede verificar si todos los valores propios de la matriz son positivos, si es así, la matriz es definida positiva:

import numpy as np

def is_pos_def(x):
    return np.all(np.linalg.eigvals(x) > 0)

Podría intentar calcular la descomposición de Cholesky (numpy.linalg.cholesky). esto aumentará LinAlgError si la matriz no es definida positiva.

Parece haber una pequeña confusión en todas las respuestas anteriores (al menos con respecto a la pregunta).

Para matrices reales, las pruebas de valores propios positivos y términos principales positivos en np.linalg.cholesky solo se aplican si la matriz es simétrica. Entonces, primero se debe probar si la matriz es simétrica y luego aplicar uno de esos métodos (valores propios positivos o descomposición de Cholesky).

Por ejemplo:

import numpy as np

#A nonsymmetric matrix
A = np.array([[9,7],[6,14]])

#check that all eigenvalues are positive:
np.all(np.linalg.eigvals(A) > 0)

#take a 'Cholesky' decomposition:
chol_A = np.linalg.cholesky(A)

La matriz A no es simétrica, pero los valores propios son positivos y Numpy devuelve una descomposición de Cholesky que es incorrecta. Puedes comprobar que:

chol_A.dot(chol_A.T)

es diferente a a.

También puede verificar que todas las funciones de python anteriores den positivo para ‘definición positiva’. Esto podría ser un problema grave si intentara utilizar la descomposición de Cholesky para calcular la inversa, ya que:

>np.linalg.inv(A)
array([[ 0.16666667, -0.08333333],
   [-0.07142857,  0.10714286]])

>np.linalg.inv(chol_A.T).dot(np.linalg.inv(chol_A))
array([[ 0.15555556, -0.06666667],
   [-0.06666667,  0.1       ]])

son diferentes.

En resumen, sugeriría agregar una línea a cualquiera de las funciones anteriores para verificar si la matriz es simétrica, por ejemplo:

def is_pos_def(A):
    if np.array_equal(A, A.T):
        try:
            np.linalg.cholesky(A)
            return True
        except np.linalg.LinAlgError:
            return False
    else:
        return False

Es posible que desee reemplazar np.array_equal(A, AT) en la función anterior por np.allclose(A, AT) para evitar diferencias debidas a errores de punto flotante.

Te mostramos las comentarios y valoraciones de los lectores

Te invitamos a añadir valor a nuestro contenido contribuyendo tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *