pymc.LKJCholeskyCov#
- class pymc.LKJCholeskyCov(name, eta, n, sd_dist, *, compute_corr=True, store_in_trace=True, **kwargs)[源代码]#
用于协方差矩阵的包装类,其相关性服从 LKJ 分布。
这定义了一个关于Cholesky分解的协方差矩阵的分布,使得基础的相关矩阵遵循LKJ分布 [1] ,而标准差遵循用户指定的任意分布。
- 参数:
- 名称 :
str
str
模型中给变量指定的名称。
- eta : 类似张量 的
float
tensor_like offloat
LKJ 分布的形状参数(eta > 0)。eta = 1 表示相关矩阵的均匀分布;较大的值则更多地赋予相关性较少的矩阵。
- n : 类似张量 的
int
python: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 时有效。
- 名称 :
- 返回:
- chol
TensorVariable
如果 compute_corr=True。未打包的 Cholesky 协方差分解。
- corr
TensorVariable
如果 compute_corr=True。协方差矩阵的相关性。
- stds
TensorVariable
如果 compute_corr=True。协方差矩阵的标准差。
- packed_chol
TensorVariable
如果 compute_corr=False,则打包的 Cholesky 协方差分解。
- chol
注释
由于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, *[, ...])