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 : 类似张量floattensor_like of float

方法的数组。必须能够与随机变量 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 中必须且只能选择一个。

示例

为给定的行和列协方差矩阵定义一个矩阵变量正态变量:

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 分布相对应的张量变量。