scipy.stats.Covariance.

from_eigendecomposition#

static Covariance.from_eigendecomposition(eigendecomposition)[源代码][源代码]#

通过特征分解提供的协方差表示

参数:
特征分解序列

一个序列(名义上是元组),包含由 scipy.linalg.eighnumpy.linalg.eigh 计算得到的特征值和特征向量数组。

注释

设协方差矩阵为 \(A\),设 \(V\) 为特征向量矩阵,设 \(W\) 为特征值的对角矩阵,使得 V W V^T = A

当所有特征值都严格为正时,对数据点 \(x\) 进行白化处理的方法是计算 \(x^T (V W^{-1/2})\),其中平方根的逆可以逐元素进行。 \(\log\det{A}\) 的计算方式为 \(tr(\log{W})\),其中 \(\log\) 操作是逐元素进行的。

这个 Covariance 类支持奇异协方差矩阵。在计算 _log_pdet 时,忽略非正特征值。当要白化的点不在协方差矩阵列的范围内时,白化定义不明确。这里采用的约定是将非正特征值的平方根的倒数视为零。

示例

准备一个对称正定协方差矩阵 A 和一个数据点 x

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> n = 5
>>> A = rng.random(size=(n, n))
>>> A = A @ A.T  # make the covariance symmetric positive definite
>>> x = rng.random(size=n)

A 进行特征分解并创建 Covariance 对象。

>>> w, v = np.linalg.eigh(A)
>>> cov = stats.Covariance.from_eigendecomposition((w, v))

Covariance 对象的功能与参考实现进行比较。

>>> res = cov.whiten(x)
>>> ref = x @ (v @ np.diag(w**-0.5))
>>> np.allclose(res, ref)
True
>>> res = cov.log_pdet
>>> ref = np.linalg.slogdet(A)[-1]
>>> np.allclose(res, ref)
True