pymc.MatrixNormal#
- class pymc.MatrixNormal(name, *args, rng=None, dims=None, initval=None, observed=None, total_size=None, transform=UNSET, **kwargs)[源代码]#
矩阵值正态对数似然。
\[f(x \mid \mu, U, V) = \frac{1}{(2\pi^{m n} |U|^n |V|^m)^{1/2}} \exp\left\{ -\frac{1}{2} \mathrm{Tr}[ V^{-1} (x-\mu)^{\prime} U^{-1} (x-\mu)] \right\}\]支持
\(x \in \mathbb{R}^{m \times n}\)
均值
\(\mu\)
行方差
\(U\)
列方差
\(V\)
- 参数:
- mu : 类似张量 的
float
tensor_like offloat
方法的数组。必须能够与随机变量 X 进行广播,使得 mu + X 的形状为 (M, N)。
- rowcov : (M, M) 类似张量 的
float
, 可选(M,M) 行间协方差矩阵。定义列内的方差。rowcov 或 rowchol 中必须恰好有一个。
- rowchol : (M, M) 类似张量 的
float
, 可选(M,M) 行间协方差矩阵的 Cholesky 分解。rowcov 或 rowchol 中必须且只能有一个被指定。
- colcov : (N, N) 类似张量 的
float
, 可选(N,N) 列间协方差矩阵。如果 rowcov 是单位矩阵,则此函数的作用与 MvNormal 中的 cov 相同。colcov 或 colchol 中必须且只能有一个被指定。
- colchol : (N, N) 类似张量 的
float
, 可选(N,N) 列间协方差矩阵的 Cholesky 分解。colcov 或 colchol 中必须且只能选择一个。
- mu : 类似张量 的
示例
为给定的行和列协方差矩阵定义一个矩阵变量正态变量:
colcov = np.array([[1., 0.5], [0.5, 2]]) rowcov = np.array([[1, 0, 0], [0, 4, 0], [0, 0, 16]]) m = rowcov.shape[0] n = colcov.shape[0] mu = np.zeros((m, n)) vals = pm.MatrixNormal('vals', mu=mu, colcov=colcov, rowcov=rowcov)
在上文中,vals 中的第 i 行具有通过 4^i 缩放的方差。或者,可以用行或列的 Cholesky 矩阵替换任一协方差矩阵。MatrixNormal 是一种更快的计算 MvNormal(mu, np.kron(rowcov, colcov)) 的方法,它利用了用于逆运算的 Kronecker 积的性质。例如,如果从 MvNormal 中抽取的样本具有相同的协方差结构,但被未知常数的不同幂次缩放,则可以如下学习协方差和缩放(有关此内容的更多信息,请参阅 LKJCholeskyCov 的文档字符串)
# Setup data true_colcov = np.array([[1.0, 0.5, 0.1], [0.5, 1.0, 0.2], [0.1, 0.2, 1.0]]) m = 3 n = true_colcov.shape[0] true_scale = 3 true_rowcov = np.diag([true_scale**(2*i) for i in range(m)]) mu = np.zeros((m, n)) true_kron = np.kron(true_rowcov, true_colcov) data = np.random.multivariate_normal(mu.flatten(), true_kron) data = data.reshape(m, n) with pm.Model() as model: # Setup right cholesky matrix sd_dist = pm.HalfCauchy.dist(beta=2.5, shape=3) colchol_packed = pm.LKJCholeskyCov('colcholpacked', n=3, eta=2, sd_dist=sd_dist) colchol = pm.expand_packed_triangular(3, colchol_packed) # Setup left covariance matrix scale = pm.LogNormal('scale', mu=np.log(true_scale), sigma=0.5) rowcov = pt.diag([scale**(2*i) for i in range(m)]) vals = pm.MatrixNormal('vals', mu=mu, colchol=colchol, rowcov=rowcov, observed=data)
方法
MatrixNormal.dist
(mu[, rowcov, rowchol, ...])创建一个与 cls 分布相对应的张量变量。