scipy.stats.matrix_normal#
- scipy.stats.matrix_normal = <scipy.stats._multivariate.matrix_normal_gen object>[源代码]#
一个矩阵正态随机变量。
mean 关键字指定均值。 rowcov 关键字指定行之间的协方差矩阵。“colcov” 关键字指定列之间的协方差矩阵。
- 参数:
- meanarray_like,可选
分布的均值(默认值:None)
- rowcovarray_like,可选
分布的行之间协方差矩阵(默认值:
1
)- colcovarray_like,可选
分布的列之间协方差矩阵(默认值:
1
)- seed{None, int, np.random.RandomState, np.random.Generator}, 可选
用于抽取随机变量。 如果 seed 为 None,则使用 RandomState 单例。 如果 seed 是一个整数,则会使用一个新的
RandomState
实例,并使用 seed 进行种子设定。 如果 seed 已经是一个RandomState
或Generator
实例,则会使用该对象。 默认值为 None。
注释
如果 mean 设置为 None,则将使用零矩阵作为均值。 此矩阵的维度从 rowcov 和 colcov 的形状推断得出(如果提供了这些),或者如果含糊不清,则设置为
1
。rowcov 和 colcov 可以是二维 array_like,直接指定协方差矩阵。 或者,一维数组将被解释为对角矩阵的条目,标量或零维数组将被解释为此值乘以单位矩阵。
由 rowcov 和 colcov 指定的协方差矩阵必须是(对称)正定的。 如果 X 中的样本是 \(m \times n\),则 rowcov 必须是 \(m \times m\),并且 colcov 必须是 \(n \times 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)\)(通过连接 \(X\) 的列形成的向量)具有多元正态分布,其均值为 \(\mathrm{Vec}(M)\),协方差为 \(V \otimes U\) (其中 \(\otimes\) 是克罗内克积)。 对于矩阵正态分布,采样和 pdf 评估为 \(\mathcal{O}(m^3 + n^3 + m^2 n + m n^2)\),但对于等效的多元正态分布,则为 \(\mathcal{O}(m^3 n^3)\),这使得这种等效形式在算法上效率低下。在 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.
方法
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)
微分熵。