scipy.stats.matrix_normal#

scipy.stats.matrix_normal = <scipy.stats._multivariate.matrix_normal_gen object>[源代码]#

一个矩阵正态随机变量。

mean 关键字指定均值。rowcov 关键字指定行间协方差矩阵。colcov 关键字指定列间协方差矩阵。

参数:
平均类似数组, 可选

分布的均值(默认:None

rowcov类似数组, 可选

分布的行间协方差矩阵(默认值:1

colcov类似数组, 可选

分布的列间协方差矩阵(默认值:1

种子{None, int, np.random.RandomState, np.random.Generator}, 可选

用于绘制随机变量。如果 seedNone,则使用 RandomState 单例。如果 seed 是整数,则使用新的 RandomState 实例,并以 seed 为种子。如果 seed 已经是 RandomStateGenerator 实例,则使用该对象。默认值为 None

方法

pdf(X, mean=None, rowcov=1, colcov=1)

概率密度函数。

logpdf(X, mean=None, rowcov=1, colcov=1)

概率密度函数的对数。

rvs(mean=None, rowcov=1, colcov=1, size=1, random_state=None)

绘制随机样本。

entropy(rowcol=1, colcov=1)

微分熵。

注释

如果 mean 设置为 None,则使用零矩阵作为均值。该矩阵的维度根据 rowcovcolcov 的形状推断,如果提供了这些参数,或者在模糊情况下设置为 1

rowcovcolcov 可以是二维的 array_like 对象,直接指定协方差矩阵。或者,一维数组将被解释为对角矩阵的元素,标量或零维数组将被解释为该值乘以单位矩阵。

rowcovcolcov 指定的协方差矩阵必须是(对称)正定的。如果 X 中的样本是 \(m imes n\),那么 rowcov 必须是 \(m imes m\),而 colcov 必须是 \(n imes n\)mean 必须与 X 形状相同。

matrix_normal 的概率密度函数为

\[f(X) = (2 \pi)^{-\frac{mn}{2}}|U|^{-\frac{n}{2}} |V|^{-\frac{m}{2}} \exp\left( -\frac{1}{2} \mathrm{Tr}\left[ U^{-1} (X-M) V^{-1} (X-M)^T \right] \right),\]

其中 \(M\) 是均值,\(U\) 是行间协方差矩阵,\(V\) 是列间协方差矩阵。

multivariate_normal 分布的 allow_singular 行为目前不受支持。协方差矩阵必须是满秩的。

matrix_normal 分布与 multivariate_normal 分布密切相关。具体来说,\(\mathrm{Vec}(X)`(由 :math:`X\) 的列连接形成的向量)具有均值为 \(\mathrm{Vec}(M)\) 和协方差为 \(V \otimes U`(其中 :math:\)otimes` 是克罗内克积)的多变量正态分布。对于矩阵正态分布,采样和概率密度函数评估的复杂度为 \(\mathcal{O}(m^3 + n^3 + m^2 n + m n^2)\),但对于等价的多变量正态分布,复杂度为 \(\mathcal{O}(m^3 n^3)\),这使得这种等价形式在算法上效率低下。

Added in version 0.17.0.

示例

>>> import numpy as np
>>> from scipy.stats import matrix_normal
>>> M = np.arange(6).reshape(3,2); M
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> U = np.diag([1,2,3]); U
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])
>>> V = 0.3*np.identity(2); V
array([[ 0.3,  0. ],
       [ 0. ,  0.3]])
>>> X = M + 0.1; X
array([[ 0.1,  1.1],
       [ 2.1,  3.1],
       [ 4.1,  5.1]])
>>> matrix_normal.pdf(X, mean=M, rowcov=U, colcov=V)
0.023410202050005054
>>> # Equivalent multivariate normal
>>> from scipy.stats import multivariate_normal
>>> vectorised_X = X.T.flatten()
>>> equiv_mean = M.T.flatten()
>>> equiv_cov = np.kron(V,U)
>>> multivariate_normal.pdf(vectorised_X, mean=equiv_mean, cov=equiv_cov)
0.023410202050005054

或者,可以通过调用对象(作为函数)来固定均值和协方差参数,返回一个“冻结”的矩阵正态随机变量:

>>> rv = matrix_normal(mean=None, rowcov=1, colcov=1)
>>> # Frozen object with the same methods but holding the given
>>> # mean and covariance fixed.