Path: blob/master/site/zh-cn/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
贝叶斯高斯混合模型与汉密尔顿 MCMC
在此 Colab 中,我们将仅使用 TensorFlow Probability 基元探索从贝叶斯高斯混合模型 (BGMM) 的后验中进行采样。
模型
对于每个维度 的 混合分量,我们希望使用以下贝叶斯高斯混合模型对 iid 样本进行建模:
请注意,scale
参数都具有 cholesky
语义。我们使用此约定是因为它是 TF 分布(它本身使用此约定,部分原因是它在计算上具有优势)的约定。
我们的目标是从后验生成样本:
请注意不存在 ,我们只对不会随 缩放的随机变量感兴趣。(幸运的是,存在一个 TF 分布可以处理 的边缘化。)
It is not possible to directly sample from this distribution owing to a computationally intractable normalization term.
梅特罗波利斯-黑斯廷斯算法是一种用于从难以归一化的分布进行抽样的技术。
TensorFlow Probability 提供了许多 MCMC 选项,其中包括一些基于梅特罗波利斯-黑斯廷斯算法的选项。在此笔记本中,我们将使用汉密尔顿蒙特卡洛算法 (tfp.mcmc.HamiltonianMonteCarlo
)。HMC 通常是一个不错的选择,因为它可以快速收敛、可以对状态空间进行联合采样(相对于协调方式),还可以利用 TF 的其中一个优点:自动微分。即便如此,实际上通过其他方式(例如吉布斯采样)可能可以更好地完成从 BGMM 后验分布的采样。
在实际构建模型之前,我们需要定义一种新的分布类型。从上面的模型规范中可以明显看出,我们在使用逆协方差矩阵对 MVN 进行参数化,即[精度矩阵] (https://en.wikipedia.org/wiki/Precision_(statistics)))。为了在 TF 中实现此操作,我们需要推出 Bijector
。这个 Bijector
将使用前向转换:
Y = tf.linalg.triangular_solve((tf.linalg.matrix_transpose(chol_precision_tril), X, adjoint=True) + loc
log_prob
正好相反,即:
X = tf.linalg.matmul(chol_precision_tril, X - loc, adjoint_a=True)
由于 HMC 只需 log_prob
,这意味着我们会避免调用 tf.linalg.triangular_solve
(与 tfd.MultivariateNormalTriL
一样)。这样做有优势,因为由于缓存位置更好,tf.linalg.matmul
通常更快。
tfd.Independent
分布会将一个分布的独立图表转变为具有统计独立坐标的多元分布。就计算 log_prob
而言,此“元分布”表现为事件维度上的简单总和。
另请注意,我们接受缩放矩阵的 adjoint
(“转置”)。这是因为如果精确率是逆协方差,即 ,并且如果 ,则 ,其中 。
由于这种分布不好处理,让我们来快速验证一下 MVNCholPrecisionTriL
是否能够按照我们的预期工作。
由于样本均值和协方差接近真实均值和协方差,因此似乎分布已正确实现。现在,我们将使用 MVNCholPrecisionTriL
tfp.distributions.JointDistributionNamed
来指定 BGMM 模型。对于观察模型,我们将使用 tfd.MixtureSameFamily
自动集成 绘图。
生成“训练”数据
对于此演示,我们将对一些随机数据进行采样。
使用 HMC 的贝叶斯推断
现在,我们已经使用了 TFD 来指定我们的模型并获得了一些观察到的数据,我们已经具备了运行 HMC 所需的所有部件。
为此,我们将使用部分应用来“固定”我们不想采样的内容。在本例中,这意味着我们只需要固定 observations
。(超参数已烘焙到先验分布中,而不是 joint_log_prob
函数签名的一部分。)
无约束表示
汉密尔顿蒙特卡洛 (HMC) 要求目标对数概率函数的参数可微。此外,如果状态空间无约束,则 HMC 可以显著提高统计效率。
这意味着从 BGMM 后验进行采样时,我们必须解决两个主要问题:
表示离散概率向量,即必须使 且 ParseError: KaTeX parse error: Expected 'EOF', got '&' at position 9: \theta_k&̲gt;0。
表示逆协方差矩阵,即必须使 (即为正定。
为了满足此要求,我们需要:
将约束变量转换为无约束空间
在无约束空间中运行 MCMC
将无约束变量转换回约束空间
至于 MVNCholPrecisionTriL
,我们将使用 Bijector
将随机变量转换为无约束空间。
Dirichlet
通过 Softmax 函数转换为无约束空间。我们的精确率随机变量是半正定矩阵上的分布。为了取消约束,我们将使用
FillTriangular
和TransformDiagonal
双射器。这些会将向量转换为下三角矩阵,并确保对角线为正。前者很有用,因为它可以仅对 浮点进行采样,而非 。
现在,我们将执行链并打印后验均值。
结论
这个简单的 Colab 演示了如何将 TensorFlow Probability 基元用于构建分层贝叶斯混合模型。