e0fb088be82726f459e61d5bdcb6ea65.png

来源:菜J数据分析
本文约1600字,建议阅读5分钟
本文为你介绍“贝叶斯模型”。

一、概述

贝叶斯结构时间序列(Bayesian structural time series,BSTS) 与我们之前通过卡尔曼波器使用过的线性高斯模型有关。二者的主要区别在于,贝叶斯结构时间序列提供了一种方法,可以使用已有的组件来构建更复杂的模型。这些模型可以反映已知事实或关于系统的有趣假设。然后,我们可以设计结构,使用稳健的拟合技术,结合我们手上的数据,估计所建模型的参数,并查看该模型能否很好地描述和预测系统的行为。与我们在讨论卡尔曼滤波器时谈到的线性高斯模型相比,贝叶斯结构时间序列模型的数学运算更复杂,并且计算量也更大。出于这个原因,我们仍遵循先概述后编码的顺序。

要拟合贝叶斯结构时间序列模型,需要按照以下顺序执行 4 个步骤:

1.定义一个结构模型,其中包括先验规范;

2. 根据观测数据,应用卡尔曼滤波器更新状态的估计值;

3.采用钉板法(spike-and-slab method) 对结构模型进行变量选择;

4.出于生成预测结果的目的,使用贝叶斯模型平均法将结果组合到一起。

在下一个示例中,我们将只关注步骤 1 和步骤 2,并用已有的模块化组件定义一个灵活的模型,然后使用该模型来拟合我们的数据。在此期间,我们将使用贝叶斯方法持续更新参数估计值。

二、代码

我们使用 OpenEI的一个开放数据集,以及由谷歌开发的工具包 bsts。bsts 是一个流行且强大的贝叶斯结构时间序列工具包。

我们首先对数据进行可视化,以了解我们要建模的对象,如图 7-8 所示:

f7107d056fd6227b4ee04cd8464fbf82.png

查看数据有助于了解如何建模。我们可以看到,数据中存在某种明确的每日规律,甚至可能也存在某种周内规律。这些模式即是我们将在模型中描述的季节性行为。在绘制整个数据集 (图 7-8 中的上图)时,我们还希望考虑数据表现出不稳定行为的趋势。

085ee77aafd05358e95099f1eb05ad92.png

该模型中的局部线性趋势基于这样的假设:数据趋势的均值和斜率都遵循随机游走的模式。

82c3d09ffc2e0adc688e71dce48a8638.png

该模型的季节分量有两个参数:一个表示季节的数量,另一个表示季节的持续时间。在添加的第一个季节分量 (该季节分量反映了一个每日循环) 中,我们希望一天中的每一小时对应一个季节,且每个季节只持续一小时。在添加的第二个季节分量 (该季节分量反映了一个每周循环)中,我们希望一周中的每一天对应一个季节,且每个季节持续 24 小时。

你可能会感到疑惑是否确实要从周一 (假设我们都认为周一是一周的首日)的 00:01开始?需要注意的是,保持一致性比确认一周的首日为周一更重要。在本例的周期性模式中,似乎任何将数据分割成 24 小时的方法都可以用于季节性分析。下面展示代码中计算量最大的部分。bsts 包的优点在于,我们能够进行大量针对后验概率的马尔可夫链蒙特卡罗计算。

65cedef174baff2d0fa963da83af85d5.png

我们还可以检查季节分量,比如像下面这样检查周内每日的节分量 (如图 7-9 和图 7-10所示)。

7df7a14afad08b1ffbec8b0b5d2030cd.png

9465a6966efa227d18787bcd7856e5fa.png

3da4a2de104ebbf0c3f59d790e222e9c.png

周内每日的季节分量表现出了极强的稳定性,而在图 7-10 的中间子图中,一天内每小时的季节性表现出随时间变化的趋势,这可能与白天的时间变化有关。在图 7-10 中,我们还看到参数与局部线性趋势相吻合,这表明电力需求总体呈下降趋势最后,我们进行预测,并绘制预测结果的后验分布图,如图 7-11 所示。需要注意的是,在建模过程结束之前,我们可以灵活地指定想预测的时间范围。由于数据是小时级的,因此虽然看起来要预测未来 24 个时间范围有些不切实际,但实际上只相当于预测一天的数据我们还希望看到预测上下文之前的 72 个时间范围内的数据,如下所示。

2d69ec3d62c21a44c91fd2ee0fb2aebb.png

59fe05ff8428db04449e94a95070baa3.png

三、拓展

在 bsts 工具包和贝叶斯结构时间序列建模中,有相当多的选项还未用到,举例如下:

(1)我们没有指定非标准先验;

(2)我们没有使用钉板法来选择回归变量;

(3)我们没有使用贝叶斯模型平均法。

这些都可以通过 bsts 工具包来实现,你可以很容易地从文档中找到教程。

对于贝叶斯结构时间序列可以做什么,以上仅展示了冰山一角。以下是贝叶斯结构时间序列的其他一些重要的可用选项。

使用贝叶斯结构时间序列,可以向建模过程注入任何类型的先验。我们在讨论卡尔曼滤波器时涉及的标准线性高斯模型就是一种注入普通先验的方法。此外,贝叶斯结构时间序列还提供了许多其他选项 (比如非对称先验)。你可以对贝叶斯结构时间序列模型进行变量选择贝叶斯结构时间序列模型可以通过贝叶斯模型平均法进行组合,这有助于消除最初选择模型所带来的不确定性。

尽管我们没有在当前的建模示例中使用这些选项,但利用 bsts 工具包在建模过程中使用这些选项并不难。你可以在网上找到许多示例。

编辑:于腾凯

校对:林亦霖

3646b711f53649debbbc1c5fa1579335.png

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐