from_precision#
- static Covariance.from_precision(precision, covariance=None)[source]#
Return a representation of a covariance from its precision matrix.
- Parameters:
- precisionarray_like
The precision matrix; that is, the inverse of a square, symmetric, positive definite covariance matrix.
- covariancearray_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 pointx
. (If the precision matrix is not already available, consider the other factory methods of theCovariance
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