跳转到主要内容

从exoplanet项目中提取的PyMC3附加组件

项目描述

PyMC3附加组件

此库包括各种用于与PyMC3一起使用的实验性或特殊用途的附加组件,这些组件已从exoplanet项目提取。最广泛使用的组件可能是为PyMC3 NUTS采样器定制的调整函数,如以下所述,但它还包括一些用于非线性优化一些自定义分布的辅助函数。

以下为使用说明,以及GitHub上notebooks分支上的自动生成的教程笔记本。

安装

您需要一个Python安装(已在版本3.7和3.8上测试),通常最好使用conda安装PyMC3,以便它可以处理编译器设置的所有细节。此步骤是可选的,但我会为使用PyMC3的项目创建一个干净的conda环境

# Optional
conda create -n name-of-my-project python=3.8 pymc3
conda activate name-of-my-project

安装此包的最简单方法是使用pip

python -m pip install -U pymc3-ext

这将更新依赖项,如PyMC3,这可能是您想要的,因为此包只在两个包的最新版本上进行了测试。

NUTS调整

pymc3-ext库提供的主要功能是PyMC3中pm.sample函数的即插即用替代品

import pymc3_ext as pmx

with model:
    trace = pmx.sample()

这调整了默认设置(如密集质量矩阵自适应和更高的目标接受分数等),使其更符合天体物理学用户的需求,但也提供了一些可能提高采样性能的其他功能。

以下描述了主要功能,但更多细节可以在采样教程笔记本中找到。

调整计划

与PyMC3中实现的标准化pmx.sample相比,主要区别在于调整计划。在PyMC3中,默认的调整计划非常简单:(a)每一步更新步长参数, (b)每N步更新质量矩阵。实际上,程序要复杂一些,但这正是关键。相反,pmx.sample使用一个“快速”和“慢速”更新计划,其自适应窗口加倍,几乎与Stan项目使用的方案相同。我们发现,这可以显著优于默认算法,并且很少导致性能下降。

参数组

由于此pmx.sample函数默认估算密集质量矩阵,对于具有大量参数的问题,采样器的内存和计算需求(以及数值误差)可能会显著增加。此库包括支持对已知具有协方差参数进行分组,以便质量矩阵是分块对角而不是密集的。例如,在下面的代码片段中,参数x已知是相关的,而参数y只需要对角质量矩阵。

import pymc3 as pm
import pymc3_ext as pmx

with pm.Model():
    # `L` is the Cholesky factor of a covariance matrix with off-diagonal elements
    x = pm.MvNormal("x", mu=np.zeros(L.shape[0]), chol=L, shape=L.shape[0])
    y = pm.Normal("y", shape=5)

    trace = pmx.sample(
        parameter_groups=[
            [x],
            pmx.sampling.ParameterGroup([y], "diag"),
        ],
    )

可变目标接受分数(实验性)

pmx.sample函数还包括对实验性功能的支持,其中目标接受分数在整个调整阶段进行调整。当早期预热窗口运行缓慢时,这很有用,因为高目标接受分数将需要非常小的步长,这不适合搜索典型集。可以通过提供initial_accept参数(通常设置为类似0.5)来使用此功能,并将其传递给pmx.sample。这将是在开始时的目标接受分数,它将在调整阶段增加到target_accept(默认为0.9)。

优化

当PyMC3向pm.find_MAP函数添加警告时,我们在exoplanet中实现了一个自定义非线性优化框架,因为它通常在初始化许多天体物理学问题(以及可能的其他地方)的采样器时非常有用。虽然pm.find_MAP不再抱怨,但包括pymc3_ext.optimize函数是为了向后兼容,尽管它应该具有与pm.find_MAP类似的行为。要使用此函数,您将执行以下操作:

import pymc3_ext as pmx

with model:
    soln = pmx.optimize(vars=[var1, var2])
    soln = pmx.optimize(start=soln, vars=[var3])

分布

此库中的大多数自定义分布都是为了使处理周期性参数(如角度)更容易。所有这些重新参数化都可以手动实现,但将它们放在更紧凑的形式中很有用。以下是包括的分布及其简短描述的列表:

  • pmx.UnitVector:一个向量,其平方和固定为1。对于多维形状,归一化是在最后一个维度上执行的。
  • pmx.UnitDisk:二维参数被限制在单位圆盘内。当角度和幅度必须在零到一的范围(例如,轨道的偏心率向量)内时,这将很有用。此分布被限制,使得零轴上的平方和始终小于1。请注意,此分布的零轴形状必须是二维。
  • pmx.Angle:一个被限制在 -π 到 π 范围内的角度。实际的采样是在二维向量空间 (sin(theta), cos(theta)) 中进行的,这样采样器就不会在 π 处看到不连续性。作为一个技术细节,这个分布的性能可能会受到 regularization 参数的影响,该参数有助于处理当此参数约束良好/差时引入的病理几何。默认值(10.0)被选为一个合理的默认选择,但您可能通过调整此值获得更好的性能。
  • pmx.Periodic:是 pmx.Angle 的一个扩展,它支持允许范围的任意上界和下界。
  • pmx.UnitUniform:此分布等同于 pm.Uniform(lower=0, upper=1),但在某些情况下可能更数值稳定。

许可证

版权所有 2020 丹·福雷曼-麦凯和贡献者。

pymc3-ext 是免费软件,在 MIT 许可下提供。有关详细信息,请参阅 LICENSE 文件。

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面