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

均值向量,与 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 : 标量,可选标量,可选

高斯白噪声的标准差。

参考文献

[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)

是相同的,其中 covschols 各自被转换为特征分解。

方法

KroneckerNormal.dist(mu[, covs, chols, ...])

创建一个与 cls 分布相对应的张量变量。