Skip to main content
`Ctrl`+`K`

# scipy.stats.Covariance.from_precision

static Covariance.from_precision(precision, covariance=None)

  Return a representation of a covariance from its precision matrix.

  Parameters:
    precision array_like

      The precision matrix; that is, the inverse of a square, symmetric, positive definite covariance matrix.

    covariance array_like, optional

      The square, symmetric, positive definite covariance matrix. If not provided, this may need to be calculated (e.g. to evaluate the cumulative distribution function of `scipy.stats.multivariate_normal`) by inverting precision.

  Notes

  Let the covariance matrix be \(A\), its precision matrix be \(P = A^{-1}\), and \(L\) be the lower Cholesky factor such that \(L L^T = P\). Whitening of a data point \(x\) is performed by computing \(x^T L\). \(\log\det{A}\) is calculated as \(-2tr(\log{L})\), where the \(\log\) operation is performed element-wise.

  This `Covariance` class does not support singular covariance matrices because the precision matrix does not exist for a singular covariance matrix.

  Examples

  Prepare a symmetric positive definite precision matrix `P` and a data point `x`. (If the precision matrix is not already available, consider the other factory methods of the `Covariance` class.)

      >>> import numpy as np
      >>> from scipy import stats
      >>> rng = np.random.default_rng()
      >>> n = 5
      >>> P = rng.random(size=(n, n))
      >>> P = P @ P.T  # a precision matrix must be positive definite
      >>> x = rng.random(size=n)

  Create the `Covariance` object.

      >>> cov = stats.Covariance.from_precision(P)

  Compare the functionality of the `Covariance` object against reference implementations.

      >>> res = cov.whiten(x)
      >>> ref = x @ np.linalg.cholesky(P)
      >>> np.allclose(res, ref)
      True
      >>> res = cov.log_pdet
      >>> ref = -np.linalg.slogdet(P)[-1]
      >>> np.allclose(res, ref)
      True