2017-10-13 1 views
0

NB: ce problème se produit réellement à l'intérieur de tensorflow, et résulte en des échantillons qui ne sont pas exactement du vrai pdf. Le principe est cependant le même en numpy, et mon but est de comprendre l'avertissement suivant.Erreur semi-définie positive lors de l'échantillonnage à partir d'une norme multivariée en python?

A savoir, j'essaie d'échantillonner à partir d'une normale multivariée en python. C'est

np.random.multivariate_normal(mean = some_mean_vector, cov = some_cov_matrix) 

Bien sûr, toute matrice de covariance valide doit être semi-définie positive. Cependant, certaines matrices de covariance utilisées pour l'échantillonnage (qui passent tous les tests pour semi-positivité), donnent l'avertissement suivant

/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:1: RuntimeWarning: covariance is not positive-semidefinite. 

Une telle matrice est

A = array([[ 1.00000359e-01, -3.66802835e+00],[ -3.66802859e+00, 1.34643845e+02]], dtype=float32) 

pour que je peux trouver à la fois le Cholesky décomposition et valeurs propres sans avertissement (la plus petite valeur propre est 7.42144039e-05).

Quelqu'un peut-il m'aider et me dire pourquoi cela pourrait se produire? (En tensorflow, je ne fais qu'alimenter la décomposition de la matrice ci-dessus et recevoir des échantillons inexacts, ce qui gâche tout ce que j'essaie de faire).

Répondre

1

La discussion de ce pull request contient des informations sur ce qui déclenche cet avertissement. Selon the source:

# Also check that cov is positive-semidefinite. If so, the u.T and v 
    # matrices should be equal up to roundoff error if cov is 
    # symmetrical and the singular value of the corresponding row is 
    # not zero. We continue to use the SVD rather than Cholesky in 
    # order to preserve current outputs. Note that symmetry has not 
    # been checked. 

Il semble que dans votre cas, les tests basés sur SVD et Cholesky donnent des résultats différents.