pymc.model.core.Deterministic#

pymc.model.core.Deterministic(name, var, model=None, dims=None)[源代码]#

创建一个命名的确定性变量。

确定性节点只有在给定所有输入的情况下才是确定性的,即它们不会向模型中添加随机性。它们通常用于记录中间结果。

参数:
名称 : strstr

要在模型中注册的确定性变量的名称。

var : 类似张量tensor_like

变量计算的表达式。

模型 : Model, 可选模型,可选

要添加确定性变量的模型对象。如果提供 None ,则使用上下文堆栈中的当前模型。

dims : strtuplestr,可选python:str 或 python:tuple of python:str, 可选

变量的维度名称。

返回:
var : 类似张量tensor_like

包装在 Deterministic 中的已注册命名变量。

注释

尽管添加一个 Deterministic 节点会迫使 PyMC 计算这个表达式,否则这个表达式可能会被优化掉,但这并不会带来性能成本。实际上,Deterministic 节点是在主计算图之外计算的,可以像没有 Deterministic 节点一样进行优化。而在 NUTS 步骤中,优化后的图可以被评估数千次,Deterministic 量只在步骤结束时计算一次,使用其他随机变量的最终值。

示例

确实,PyMC 允许随机变量的任意组合,例如在逻辑回归的情况下

with pm.Model():
    alpha = pm.Normal("alpha", 0, 1)
    intercept = pm.Normal("intercept", 0, 1)
    p = pm.math.invlogit(alpha * x + intercept)
    outcome = pm.Bernoulli("outcome", p, observed=outcomes)

但不会记住表达式 pm.math.invlogit(alpha * x + intercept) 已被赋值给变量 p 的事实。如果量 p 很重要,并且希望在采样轨迹中跟踪其值,那么可以使用一个确定性节点:

with pm.Model():
    alpha = pm.Normal("alpha", 0, 1)
    intercept = pm.Normal("intercept", 0, 1)
    p = pm.Deterministic("p", pm.math.invlogit(alpha * x + intercept))
    outcome = pm.Bernoulli("outcome", p, observed=outcomes)

从数学角度来看,这两种模型是完全等价的。然而,在第一种情况下,推断数据将仅包含变量 alphainterceptoutcome 的值。在第二种情况下,它还将包含每个观测点 p 的采样值。