模拟器#

class pymc.Simulator(name, *args, **kwargs)[源代码]#

模拟器分布,用于通过 sample_smc() 进行顺序蒙特卡罗(SMC)采样的近似贝叶斯推断(ABC)。

模拟器分布具有一个由观测数据和模拟数据之间的距离度量定义的随机伪对数似然,并通过超参数 epsilon 进行调整。

参数:
fncallable()

Python 随机模拟器函数。应预期以下签名 (rng, arg1, arg2, ... argn, size),其中 rng 是一个 numpy.random.Generator,而 size 定义了所需样本的大小。

*unnamed_params : listTensorVariablepython:TensorVariable 列表

模拟器随机函数使用的参数。每个参数可以按顺序在 fn 之后传递,例如 param1, param2, ..., paramN。参数也可以通过关键字参数“params”传递。

params : listTensorVariablepython:TensorVariable 列表

‘’unnamed_params’’ 的关键字形式。必须提供 unnamed_params 或 params 之一。如果同时传递了 unnamed_params 和 params,则会引发错误。

distance : PyTensor Opcallable()str,默认值为 “gaussian”PyTensor 操作, python:callable() 或 python:str, 默认 “gaussian”

距离函数。可用选项包括 "gaussian""laplace""kullback_leibler" 或用户定义的函数(或 PyTensor_Op),该函数以 epsilon、observed_data 的汇总统计量和 simulated_data 的汇总统计量作为输入。

gaussian: \(-0.5 \left(\left(\frac{xo - xs}{\epsilon}\right)^2\right)\)

laplace: \(-{\left(\frac{|xo - xs|}{\epsilon}\right)}\)

kullback_leibler: \(\frac{d}{n} \frac{1}{\epsilon} \sum_i^n -\log \left( \frac{{\nu_d}_i}{{\rho_d}_i} \right) + \log_r\) [1]

distance="gaussian" + sum_stat="sort" 等价于 1D 2-Wasserstein 距离

distance="laplace" + sum_stat="sort" 等同于 1D 1-Wasserstein 距离

sum_stat : PyTensor Opcallable()str,默认值为 “identity”PyTensor 操作, python:callable() 或 python:str, 默认 “identity”

汇总统计函数。可用选项有 "identity", "sort", "mean", "median"。如果定义了一个可调用对象(或 PyTensor_Op),它应返回一个一维 numpy 数组(或 PyTensor 向量)。

epsilon : 类似张量float,默认值为 1.0tensor_like of python:float, 默认 1.0

距离函数的缩放参数。它应该是一个浮点数或与 sum_stat 输出大小相同的数组。

ndim_supp : int, 默认值为 0python:int, 默认 0

SimulatorRV 的维度数(0 表示标量,1 表示向量等)

ndims_params : listint,可选python:list of python:int, 可选

RV 每个参数的最小维度数。例如,如果模拟器接受两个标量输入,则应为 [0, 0]。默认值为长度等于参数数量的 0 列表。

class_name : str, 可选python:str, 可选

用于包装模拟器方法的 RandomVariable 类后缀名称。

参考文献

[1]

Pérez-Cruz, F. (2008年7月). 连续分布的Kullback-Leibler散度估计。在2008年IEEE国际信息论研讨会上(第1666-1670页)。IEEE。 链接

示例

def simulator_fn(rng, loc, scale, size):
    return rng.normal(loc, scale, size=size)

with pm.Model() as m:
    loc = pm.Normal("loc", 0, 1)
    scale = pm.HalfNormal("scale", 1)
    simulator = pm.Simulator("simulator", simulator_fn, loc, scale, observed=data)
    idata = pm.sample_smc()

方法

Simulator.dist(fn, *unnamed_params[, ...])

创建一个与 cls 分布相对应的张量变量。