pymc.KroneckerNormal#
- class pymc.KroneckerNormal(name, *args, rng=None, dims=None, initval=None, observed=None, total_size=None, transform=UNSET, **kwargs)[源代码]#
具有Kronecker结构协方差的多变量正态对数似然。
\[f(x \mid \mu, K) = \frac{1}{(2\pi |K|)^{1/2}} \exp\left\{ -\frac{1}{2} (x-\mu)^{\prime} K^{-1} (x-\mu) \right\}\]支持
\(x \in \mathbb{R}^N\)
均值
\(\mu\)
方差
\(K = \bigotimes K_i + \sigma^2 I_N\)
- 参数:
- mu : 类似张量 的
float
tensor_like offloat
均值向量,与 MvNormal 中相同。
- covspython:数组的列表
协方差矩阵集合 \([K_1, K_2, ...]\) 按提供的顺序进行Kronecker积 \(\bigotimes K_i\)。
- cholspython:数组的列表
下三角Cholesky矩阵集合 \([L_1, L_2, ...]\) 使得 \(K_i = L_i L_i'\)。
- evdspython:元组的列表
特征值-向量、特征向量-矩阵对集合 \([(v_1, Q_1), (v_2, Q_2), ...]\) 使得 \(K_i = Q_i \text{diag}(v_i) Q_i'\)。例如:
v_i, Q_i = pt.linalg.eigh(K_i)
- sigma : 标量,可选标量,可选
高斯白噪声的标准差。
- mu : 类似张量 的
参考文献
[1]Saatchi, Y. (2011). “结构化高斯过程模型的可扩展推断”
示例
定义一个具有协方差 \(K = K_1 \otimes K_2\) 的多变量正态变量
K1 = np.array([[1., 0.5], [0.5, 2]]) K2 = np.array([[1., 0.4, 0.2], [0.4, 2, 0.3], [0.2, 0.3, 1]]) covs = [K1, K2] N = 6 mu = np.zeros(N) with pm.Model() as model: vals = pm.KroneckerNormal('vals', mu=mu, covs=covs, shape=N)
通过分别对 \(K_1\) 和 \(K_2\) 进行 Cholesky 分解,而不是对更大的 \(K\) 矩阵进行分解,可以提高效率。尽管这里只显示了两个矩阵 \(K_1\) 和 \(K_2\),但可以以这种方式组合任意数量的子矩阵。可以提供 Cholesky 分解和特征分解。
chols = [np.linalg.cholesky(Ki) for Ki in covs] evds = [np.linalg.eigh(Ki) for Ki in covs] with pm.Model() as model: vals2 = pm.KroneckerNormal('vals2', mu=mu, chols=chols, shape=N) # or vals3 = pm.KroneckerNormal('vals3', mu=mu, evds=evds, shape=N)
两者都不会被转换。协方差矩阵也可以添加对角噪声,\(K = K_1 \otimes K_2 + \sigma^2 I_N\)。尽管噪声消除了矩阵的整体Kronecker结构,KroneckerNormal 仍然可以通过利用幕后子矩阵的特征分解来进行高效的计算 [1]。因此,
sigma = 0.1 with pm.Model() as noise_model: vals = pm.KroneckerNormal('vals', mu=mu, covs=covs, sigma=sigma, shape=N) vals2 = pm.KroneckerNormal('vals2', mu=mu, chols=chols, sigma=sigma, shape=N) vals3 = pm.KroneckerNormal('vals3', mu=mu, evds=evds, sigma=sigma, shape=N)
是相同的,其中 covs 和 chols 各自被转换为特征分解。
方法
KroneckerNormal.dist
(mu[, covs, chols, ...])创建一个与 cls 分布相对应的张量变量。