Path: blob/master/site/zh-cn/probability/examples/Bayesian_Switchpoint_Analysis.ipynb
25118 views
Copyright 2019 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
此笔记本重新实现并扩展了 pymc3 文档中的贝叶斯“变化点分析”示例。
前提条件
数据集
概率模型
该模型会假设一个“切换点”(例如,安全法规变更的年份)以及遵循泊松分布的灾难率,该灾难率在切换点前后保持不变(但可能不同)。
实际的灾难计数是固定的(观测得到);该模型的任何样本都需要指定切换点和“早期”和“晚期”的灾难率。
来自 pymc3 文档示例的原始模型:
ParseError: KaTeX parse error: Undefined control sequence: \l at position 131: …t{if}; t < s\̲l̲ ̲&\text{if};…但是,平均灾难率 在切换点 处不连续,这使其不可微。因此,它不会向汉密尔顿蒙特卡洛 (HMC) 算法提供梯度信号,但由于此示例中 先验是连续的,HMC 回退到随机游动足以找到高概率质量的区域。
作为第二个模型,我们使用 e 和 l 之间的 sigmoid“切换”来修改原始模型,以使转换可微,并对切换点 使用连续的均匀分布。(有人可能会说这种模型更符合实际情况,因为平均率的“切换”可能会延续多年。)因此,新模型为:
在没有更多信息的情况下,我们将 假设为先验的参数。我们将运行两个模型并比较它们的推断结果。
上面的代码通过 JointDistributionSequential 分布定义了模型。使用 [0, ..., len(years)-1]
的数组调用 disaster_rate
函数以生成 len(years)
随机变量的向量:switchpoint
之前的年份是 early_disaster_rate
,之后的年份是 late_disaster_rate
(对 sigmoid 转换取模)。
下面是检查目标对数概率函数是否正常的健全性检查:
使用 HMC 进行贝叶斯推断
我们定义所需的结果和 burn-in 步骤数量;该代码主要仿照了 tfp.mcmc.HamiltonianMonteCarlo 文档。它使用自适应步长(否则结果会对所选的步长值非常敏感)。我们使用值 1 作为链的初始状态。
但是,这还不是全部。如果回到上面的模型定义,您会注意到某些概率分布未在整个实数线上很好地定义。因此,我们使用 TransformedTransitionKernel(指定前向双射器,以将实数转换到定义了概率分布的域上)封装 HMC 内核,从而约束 HMC 应检查的空间(请参阅下面代码中的注释)。
并行运行两个模型:
呈现结果
我们将早期和晚期灾难率以及切换点的结果呈现为后验分布样本的直方图。直方图上的实线表示样本中位数,虚线表示 95%ile 可信区间边界。