贝叶斯:马尔可夫链蒙特卡罗方法—梅特罗波利斯算法

用户头像数学算法大哥
2023-03-13 发布

在本文中,我们介绍了一系列主要的算法,被称为马尔可夫链蒙特卡罗方法(MCMC),这些算法可以用来近似计算贝叶斯定理的后验分布。具体而言,我们重点介绍了梅特罗波利斯算法,这个算法易于表述和理解,是学习MCMC的一个有用起点。一旦我们了解了MCMC的工作原理,我们就可以使用开源的PyMC库来实现它,这个库处理了很多底层实现细节,让我们能够专注于贝叶斯建模。

 我们的目标是基于贝叶斯模型制定定量交易策略,但要达成这个目标,我们需要学习大量的贝叶斯统计理论。本文中,我们讨论了MCMC作为一种计算后验分布的方法,特别是在共轭先验不适用的情况下。此外,我们还可以将MCMC应用于模拟其他复杂系统的后验分布,如物理学、化学、生物学等领域的问题。因此,MCMC方法具有广泛的应用价值。
  1. 为什么选择马尔可夫链蒙特卡洛方法?

    答案是,并不是所有的模型都能用共轭先验简洁地表述。特别是,许多更复杂的建模情况,尤其是与具有数百个参数的分层模型相关的情况,使用传统的分析方法处理起来是极具挑战性的。

    如果我们回想一下贝叶斯公式:

我们可以发现,为了计算P(D),我们需要对所有可能的θ值和参数进行积分:

基本问题是我们通常无法解析地计算这个积分,因此我们必须改用数值逼近方法。另一个问题是,我们的模型可能包含大量参数,这意味着我们之前的分布可能具有多个维度。这反过来意味着我们的后验分布也将是高维的。因此,我们处于这样一种情况,必须在一个可能非常大的维空间中进行数值计算,这是一个具有挑战性的问题。

因此,我们面临着一个经常被称为“维度诅咒”的挑战。简而言之,这意味着高维空间的体积如此之大,以至于该空间内的任何可用数据都变得极其稀疏,导致统计学上的问题。实际上,为了获得任何统计显著性,所需的数据量必须随着维度数量的增加呈指数级增长。如果不以明智的方式处理这些问题,这些问题通常非常难以解决。马尔可夫链蒙特卡罗方法的动机在于在高维空间内执行智能搜索,使高维贝叶斯模型易于处理。其基本思想是将“随机搜索”(蒙特卡罗方面)与智能的“跳跃”机制相结合,从后验分布中进行采样,但最终不取决于我们从何处开始(马尔可夫链方面)。因此,马尔可夫链蒙特卡罗方法是用智能跳跃执行的无记忆搜索。
值得一提的是,MCMC不仅用于进行贝叶斯统计,它也被广泛应用于计算物理学和计算生物学,因为它通常可以用于任何高维积分的近似。
  1. 马尔可夫链蒙特卡罗算法

    马尔可夫链蒙特卡罗算法(Markov Chain Monte Carlo,MCMC)是一系列的统计采样算法,而不是一种特定的方法。本文将集中讨论其中的一种称为梅特罗波利斯算法的特殊方法。

    梅特罗波利斯算法(Metropolis algorithm)是一种最简单的MCMC算法,其名称源于美国物理学家尼古拉斯·梅特罗波利斯。虽然MCMC采样算法在此后得到了实质性的改进,但这种基本方法足以满足本文的需求。通过这种简单方法获得的直觉将有助于我们在后续的文章中理解更复杂的采样器。大多数MCMC算法的基本模式往往遵循这种形式:

  2. 算法从当前参数空间中的位置开始

  3. 建议“跳转”到参数空间中的新位置
  4. 使用先前信息和可用数据大概率地接受或拒绝跳转
  5. 如果接受跳转,则移至新位置并返回步骤1
  6. 如果跳转被拒绝,则留在原地并返回步骤1
  7. 发生设定数量的跳转后,返回所有接收的位置

    梅特罗波利斯算法使用正态分布来提出跳转。该正态分布具有当前位置的平均值,并采用“建议宽度”作为标准偏差。建议宽度是该算法的一个参数,对收敛性有重要影响。建议宽度越大,跳跃的范围越远,可以覆盖后验分布中更多的空间,但最初可能会错过更高概率的区域。较小的建议宽度则不能快速覆盖很多空间,因此可能需要更长时间才能收敛。

    对于连续参数,正态分布是提出建议分布的良好选择,因为它更可能选择距离当前位置较近的点而不是较远的点。一旦提出跳转,我们需要以概率的方式决定跳转到新位置是否是一个好动作。我们计算新位置的建议分布与当前位置的建议分布之比,以确定移动的概率p:

然后,在区间[0,1]上生成一个均匀分布的随机数。如果该随机数落在区间[0,p]内,则接受移动,否则拒绝移动。

虽然这是一个相对简单的算法,但它能够帮助我们避免计算高维积分这一棘手问题。在托马斯·维茨基(Thomas Wiecki)在其关于MCMC采样的文章中所指出的,该算法实际上是将所提出的参数的后验值除以当前参数的后验值,利用贝叶斯规则从比率中消除了P(D):

可以看出,后一等式右边只包含可能性和先验概率,这两个我们都可以很容易地计算。因此,通过将一个位置处的后验值除以另一个位置的后验,我们可以更频繁地对后验概率较高的区域进行采样,以充分反映数据的概率。这意味着在我们的采样过程中,我们更有可能访问先前忽略的高概率区域,从而获得更全面的后验分布。

需要注意的是,即使使用梅特罗波利斯算法,当数据集过于庞大或模型过于复杂时,仍然可能存在计算上的困难。此时,可能需要使用更高级的MCMC算法或其他技术来进行推断。
  1. PyMC库简介

    PyMC是一个Python库,旨在为概率编程提供支持。概率编程是指对概率模型进行建模,并使用贝叶斯推断方法对其进行分析的过程。与传统的频率主义方法不同,概率编程可以更好地处理不确定性和缺乏数据的情况。PyMC是一个受欢迎的概率编程工具,它为研究人员和数据科学家提供了一种方便而灵活的方法,可以处理各种类型的数据和问题。

    PyMC的语法简洁而易于理解,使得模型规范变得非常简单。该库提供了各种主要的概率分布,包括正态分布、伽马分布和贝塔分布等,以及一些更加专业的分布,例如稳定分布和威布尔分布等。如果没有你需要的分布,你还可以通过定义自己的分布类来扩展PyMC的功能。

    PyMC还提供了强大的MCMC采样算法,用于对复杂模型进行推断。其中包括Metropolis算法和NUT采样器等。这些算法可以帮助用户定义具有数千个参数的复杂模型,并通过采样方法生成模型参数的后验分布。这些分布可以用来进行模型预测和不确定性分析,从而得出更准确的结论。

    此外,PyMC还利用了Python Theano库,该库通常用于高度CPU/GPU密集型深度学习应用程序。通过使用Theano,PyMC可以最大化执行速度的效率,从而在处理大型数据集时提供高效的性能。

    总之,PyMC是一个功能强大、易于使用的概率编程库,可以帮助用户建立复杂的概率模型,并对其进行贝叶斯推断。该库还提供了各种算法和分布,以满足不同的建模需求,并利用Theano库提供了高效的计算能力。

评论

需要帮助?

试试AI小助手吧