Skip to main content

延迟验收 MCMC 采样器

项目描述

小达

延迟接受 (Christen & Fox, 2005) 具有有限长度子链采样和自适应误差建模的 MCMC 采样器。

这是一个简单、轻量级的实现,具有最小的依赖关系,即除了 SciPy 堆栈之外没有任何东西。

它是完全必要且易于使用的!

安装

tinyDA 可以从 PyPI 安装:

pip install tinyDA

特征

提案

  • 随机游走 Metropolis Hastings (RWMH) - Metropolis 等。(1953), 黑斯廷斯 (1970)
  • 预处理 Crank-Nicolson (pCN) - Cotter 等人。(2013)
  • 自适应大都市 (AM) - Haario 等人。(2001)
  • 自适应 pCN - Hu 和 Yao (2016)
  • 梦想(Z)-Vrugt(2016)
  • Multiple-Try Metropolis (MTM) - Liu et al. (2000)

自适应误差模型

  • 国家独立 - Cui 等人。(2018)
  • 状态依赖 - Cui 等人。(2018)

诊断

  • 将 tinyDA 链转换为 ArviZ InferenceData 对象以进行近乎无限的诊断!

依赖项:

  • 数字货币
  • 科学派
  • 阿维兹
  • tqdm
  • Ray(多处理,可选)

用法

文档可在Read the Docs获得。一些说明性示例可用作根目录中的 Jupyter Notebooks。以下是核心功能的简短摘要。

分布

先验和似然可以使用标准scipy.stats类来定义:

import tinyDA as tda

from scipy.stats import multivariate_normal

# set the prior mean and covariance.
mean_prior = np.zeros(n_dim)
cov_prior = np.eye(n_dim)

# set the covariance of the likelihood.
cov_likelihood = sigma**2*np.eye(data.shape[0])

# initialise the prior distribution and likelihood.
my_prior = multivariate_normal(mean_prior, cov_prior)
my_loglike = tda.LogLike(data, cov_likelihood)

如果使用高斯似然,我们建议使用该tinyDA实现,因为它是未归一化的,并且与tda.AdaptiveLogLike用于自适应误差模型的效果很好。自制分布可以很容易地定义,并且必须有一个.rvs()随机抽样的logpdf(x)方法和一个计算对数似然的方法,根据SciPy实现。

tinyDA.LinkFactory

TinyDA 采样器的核心是我们所说的 a LinkFactory,它负责:

  1. 使用一些参数(提议)调用模型并收集模型输出。
  2. 在给定参数的情况下,评估参数的先验密度和模型输出的可能性。
  3. 构建tda.Link包含每个样本信息的实例。

LinkFactory必须通过从 或 继承来tda.LinkFactory定义tda.BlackBoxLinkFactory。前者允许使用纯 Python 或您要调用的任何外部库直接从输入参数计算模型输出。evaluate_model()因此必须覆盖该方法:

class MyLinkFactory(tda.LinkFactory):
    def evaluate_model(self, parameters):
        
        # the model output is a simple linear regression
        model_output = parameters[0] + parameters[1]*x
        
        # no quantity of interest beyond the parameters.
        qoi = None
        
        # return both.
        return model_output, qoi

my_link_factory = MyLinkFactory(my_prior, my_loglike)

后者允许将一些模型对象提供给LinkFactoryat 初始化,然后将其分配为类属性。这对于例如 PDE 求解器很有用。您的模型在调用时必须返回有序数据(例如通过__call__(self, parameters)方法),并且不需要覆盖evaluate_model(). 这就是幕后发生的事情:

class BlackBoxLinkFactory(LinkFactory):
    def evaluate_model(self, parameters):
            
        # get the model output.
        model_output = self.model(parameters)
        
        # get the quantity of interest.
        if self.get_qoi:
            qoi = self.model.get_qoi()
        else:
            qoi = None
            
        # return everything.
        return model_output, qoi

my_link_factory = BlackBoxLinkFactory(my_model, my_prior, my_loglike, get_qoi=True)

提案

提案只需使用其参数进行初始化:

# set the covariance of the proposal distribution.
am_cov = np.eye(n_dim)

# set the number of iterations before starting adaptation.
am_t0 = 1000

# set some adaptive metropolis tuning parameters.
am_sd = 1
am_epsilon = 1e-6

# initialise the proposal.
my_proposal = tda.AdaptiveMetropolis(C0=am_cov, t0=am_t0, sd=am_sd, epsilon=am_epsilon)

采样

在定义了一个提案、一个粗链接工厂my_link_factory_coarse和一个细链接工厂my_link_factory_fine之后,可以使用以下命令运行延迟接受采样器tinyDA.sample()

my_chains = tda.sample([my_link_factory_coarse, my_link_factory_fine], 
                       my_proposal, 
                       iterations=12000, 
                       n_chains=2, 
                       subsampling_rate=10)

后期处理

整个采样历史现在以my_chains带有 tinyDA.Link 实例的字典的形式存储。您可以使用以下命令将输出转换为tinyDA.sample()ArviZ InferenceData 对象

idata = tda.to_inference_data(my_chains, burnin=2000)

如果您想查看粗略样本,可以传递一个附加参数:

idata = tda.to_inference_data(my_chains, level='coarse', burnin=20000)

然后该idata对象可以与 ArviZ 诊断套件一起使用,例如获取 MCMC 统计数据、绘制轨迹等。

贡献

我(mikkelbue)目前是这个包的唯一贡献者。我一直在自己的研究中使用它,并且到目前为止(大部分)都是为自己开发它。

如果你觉得它缺少一些功能,或者有什么可以改进的,请不要犹豫,创建一个 fork 并提交 PR!如果您想帮助我改进软件包,请查看下面的 TODO 列表,并考虑是否有什么对您可行的。我目前正在撰写一篇计划提交给 JOSS 的科学论文,我很乐意让其他人参与进来。

如果您想贡献,请考虑以下事项:

  • 我希望保持依赖列表简短,并且宁愿不包含任何额外的大型库,除非有强烈的保证。使用 NumPy 可以实现伟大的事情!
  • 我很擅长将理论方法转化为计算机代码,但我不是软件工程师。任何类型的 CI、测试和对软件基础设施的改进都将不胜感激!

去做

  • 并行多链采样
  • 更人性化的诊断
  • 多级延迟验收
  • 方差减少
  • 马拉提案
  • 与框架无关的自适应粗模型的包装器
  • 分层模型的嵌入空间
  • 测试

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

tinyDA-0.9.7.1.tar.gz (34.1 kB 查看哈希

已上传 source

内置分布

tinyDA-0.9.7.1-py3-none-any.whl (35.5 kB 查看哈希

已上传 py3