pymc.LKJCholeskyCov#

class pymc.LKJCholeskyCov(name, eta, n, sd_dist, *, compute_corr=True, store_in_trace=True, **kwargs)[源代码]#

用于协方差矩阵的包装类,其相关性服从 LKJ 分布。

这定义了一个关于Cholesky分解的协方差矩阵的分布,使得基础的相关矩阵遵循LKJ分布 [1] ,而标准差遵循用户指定的任意分布。

参数:
名称 : strstr

模型中给变量指定的名称。

eta : 类似张量floattensor_like of float

LKJ 分布的形状参数(eta > 0)。eta = 1 表示相关矩阵的均匀分布;较大的值则更多地赋予相关性较少的矩阵。

n : 类似张量intpython:int 的 tensor_like

协方差矩阵的维度(n > 1)。

sd_dist : 分布发行版

一个用于标准差的正标量或向量分布,通过 .dist() API 创建。应满足 shape[-1]=n。标量分布将被自动调整大小以确保这一点。

警告

sd_dist 将被克隆,使其独立于作为输入传递的那个。

compute_corr : bool, 默认=Truebool, 默认=True

如果 True,返回三个值:Cholesky 分解、协方差矩阵的相关性和标准差。否则,仅返回打包的 Cholesky 分解。默认为 True。兼容性。

store_in_trace : bool, 默认=Truebool, 默认=True

是否在后验迹中存储协方差矩阵的相关性和标准差。如果为 True,它们将分别自动命名为 {name}_corr{name}_stds。仅在 compute_corr=True 时有效。

返回:
cholTensorVariable

如果 compute_corr=True。未打包的 Cholesky 协方差分解。

corrTensorVariable

如果 compute_corr=True。协方差矩阵的相关性。

stdsTensorVariable

如果 compute_corr=True。协方差矩阵的标准差。

packed_cholTensorVariable

如果 compute_corr=False,则打包的 Cholesky 协方差分解。

注释

由于Cholesky因子是一个下三角矩阵,我们使用压缩存储来存储矩阵:我们将下三角矩阵的值存储在一个一维数组中,按行编号:

[[0 - - -]
 [1 2 - -]
 [3 4 5 -]
 [6 7 8 9]]

当你在 pm.LKJCholeskyCov 中指定 compute_corr=True 时,Cholesky 协方差矩阵会自动计算并返回(见下例)。否则,你可以使用 pm.expand_packed_triangular(packed_cov, lower=True) 将打包的 Cholesky 矩阵转换为常规的二维数组。

参考文献

[1]

Lewandowski, D., Kurowicka, D. 和 Joe, H. (2009). “基于藤和扩展洋葱方法生成随机相关矩阵.” 多元分析杂志, 100(9), 第1989-2001页.

[2]

J. M. isn’t a mathematician (http://math.stackexchange.com/users/498/ j-m-isnt-a-mathematician), Different approaches to evaluate this determinant, URL (version: 2012-04-14): http://math.stackexchange.com/q/130026

示例

with pm.Model() as model:
    # Note that we access the distribution for the standard
    # deviations, and do not create a new random variable.
    sd_dist = pm.Exponential.dist(1.0, size=10)
    chol, corr, sigmas = pm.LKJCholeskyCov(
        'chol_cov', eta=4, n=10, sd_dist=sd_dist
    )

    # if you only want the packed Cholesky:
    # packed_chol = pm.LKJCholeskyCov(
        'chol_cov', eta=4, n=10, sd_dist=sd_dist, compute_corr=False
    )
    # chol = pm.expand_packed_triangular(10, packed_chol, lower=True)

    # Define a new MvNormal with the given covariance
    vals = pm.MvNormal('vals', mu=np.zeros(10), chol=chol, shape=10)

    # Or transform an uncorrelated normal:
    vals_raw = pm.Normal('vals_raw', mu=0, sigma=1, shape=10)
    vals = pt.dot(chol, vals_raw)

    # Or compute the covariance matrix
    cov = pt.dot(chol, chol.T)

实现 在无约束空间中,所有Cholesky因子的值都以未转换的形式存储,除了对角线上的条目,我们使用对数转换来限制它们为正值。

为了正确计算标准差和相关矩阵的对数似然,我们需要考虑第二种变换:给定协方差矩阵的Cholesky分解 \(LL^T = \Sigma\),我们可以通过 \(L\) 的行的欧几里得长度恢复标准差 \(\sigma\),并将相关矩阵的Cholesky因子表示为 \(U = \text{diag}(\sigma)^{-1}L\)。由于 \(U\) 的每一行长度为1,我们不需要存储对角线。我们定义一个变换 \(\phi\),使得 \(\phi(L)\) 是包含对角线上标准差 \(\sigma\) 和下方相关矩阵 \(U\) 的下三角矩阵。在这种形式下,我们可以轻松地分别计算不同的似然,因为相关矩阵的似然仅依赖于对角线下方的值,而标准差的似然仅依赖于对角线上的值。

我们仍然需要计算 \(\phi^{-1}\) 的雅可比行列式。如果我们把 \(\phi\) 看作是 \(\mathbb{R}^{\tfrac{n(n+1)}{2}}\) 上的自同构,其中我们按照上述笔记中的描述对维度进行排序,那么雅可比矩阵是一个分块对角矩阵,其中每个块对应于 \(U\) 的一行。每个块具有箭头形状,我们可以按照 [2] 中的描述计算其行列式。由于分块对角矩阵的行列式是各块行列式的乘积,因此我们得到

\[\text{det}(J_{\phi^{-1}}(U)) = \left[ \prod_{i=2}^N u_{ii}^{i - 1} L_{ii} \right]^{-1}\]

方法

LKJCholeskyCov.dist(eta, n, sd_dist, *[, ...])