延迟验收 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,它负责:
- 使用一些参数(提议)调用模型并收集模型输出。
- 在给定参数的情况下,评估参数的先验密度和模型输出的可能性。
- 构建
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、测试和对软件基础设施的改进都将不胜感激!
去做
并行多链采样更人性化的诊断多级延迟验收- 方差减少
- 马拉提案
- 与框架无关的自适应粗模型的包装器
- 分层模型的嵌入空间
- 测试
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。