术语表#

PyMC 文档和示例中使用的常用术语的术语表。

贝叶斯定理#

描述事件的概率,基于可能与该事件相关的条件的先验知识。 例如,如果已知健康问题的风险随年龄增长而增加,则贝叶斯定理允许更准确地评估已知年龄的个体的风险(通过根据其年龄进行条件化),而不是简单地假设该个体是整个人群的典型代表。 公式

\[ P(A|B) = \frac{P(B|A) P(A)}{P(B)} \]

其中 \(A\)\(B\) 是事件,并且 \(P(B) \neq 0\)

贝叶斯推断#

一旦我们定义了统计模型,贝叶斯推断就会处理数据和模型,以生成后验分布。 这是模型中所有参数的联合分布。 此分布用于表示合理性,并且是模型和数据的逻辑结果。

贝叶斯模型#

贝叶斯模型是变量和这些变量的分布定义的组合。 贝叶斯模型具有两个定义特征:i) 使用概率分布描述未知量,以及 ii) 贝叶斯定理用于更新以数据为条件的参数值

贝叶斯工作流程#

贝叶斯工作流程包括模型构建所需的所有步骤。 这包括贝叶斯推断,但也包括其他任务,例如 i) 推断质量的诊断,ii) 模型批评,包括模型假设和模型预测的评估,iii) 模型比较,不仅为了模型选择或模型平均的目的,更重要的是为了更好地理解这些模型,以及 iv) 为特定受众准备结果。 这些非推断性任务需要数值和可视化摘要,以帮助从业者分析他们的模型。 它们有时统称为贝叶斯模型的探索性分析

  • 有关简洁的概述,请参阅 van de Schoot, R., Depaoli, S., King, R. 等人在 Nat Rev Methods - Primers 1, 1 (2021) 中撰写的《贝叶斯统计和建模》。

  • 有关深入的概述,请参阅 Andrew Gelman、Aki Vehtari、Daniel Simpson、Charles C. Margossian、Bob Carpenter、Yuling Yao、Lauren Kennedy、Jonah Gabry、Paul-Christian Bürkner、Martin Modrák 撰写的《贝叶斯工作流程》。

  • 有关基于练习的材料,请参阅 Allen B. Downey 撰写的《Think Bayes 2e:贝叶斯统计简易入门》。

  • 有关即将出版的教科书,其中使用了 PyMC、Tensorflow Probability 和 ArviZ 库,请参阅 Osvaldo A. Martin、Ravin Kumar 和 Junpeng Lao 撰写的《贝叶斯建模与计算》。

可信度#

用于预测不确定的未来事件的一种统计推断形式

调度#

根据输入变量的类型(通常只是第一个变量)选择要使用的函数或方法实现。 有关一些示例,请参阅 Python 的 singledispatch 装饰器的文档。

离散度#

在统计学中,离散度(也称为变异性、散布或分散度)是分布被拉伸或挤压的程度

函数式编程#

函数式编程是一种编程风格,它偏好使用具有显式和不同输入和输出的基本函数。 这与依赖于未显式作为输入传递的变量的函数或方法(例如访问方法内部的 self.variable)或就地更改输入或其他状态变量而不是返回新的不同变量作为输出的函数或方法形成对比。

广义线性模型#
GLM#

在广义线性模型 (GLM) 中,我们假设响应变量 \(y_i\) 服从均值为 \(\mu_i\) 的指数族分布,\(\mu_i\) 被假定为 \(x_i^T\beta\) 的某个(通常是非线性)函数。 它们被认为是线性的,因为协变量仅通过线性组合 \(x_i^T\beta\) 影响 \(Y_i\) 的分布。 广义线性模型的一些示例包括:线性回归、方差分析、逻辑回归和泊松回归

注意

不要将这些与一般线性模型混淆

广义泊松分布#

作为广义负二项分布的极限形式,获得了泊松分布的推广,具有两个参数 X1 和 X2。 分布的方差大于、等于或小于均值,具体取决于 X2 是正数、零还是负数。 有关公式和更多详细信息,请访问标题中的链接。

哈密顿蒙特卡洛#
HMC#

一种马尔可夫链蒙特卡洛方法,用于获取随机样本序列,这些样本序列收敛为根据目标概率分布进行分布。

分层常微分方程#

个人、群体或其他级别类型的常微分方程计算。

似然性#

关于似然性有很多观点,但从概念上讲,我们可以将其视为给定参数的数据概率。 或者换句话说,作为可能产生数据的相对方式的数量。

  • 有关该概念的深入展开,请参阅 Richard McElreath 撰写的《统计再思考》第二版,特别是第 2 章。

  • 有关基于问题的材料,请参阅 Allen B. Downey 撰写的《Think Bayes 2e:贝叶斯统计简易入门》。

  • 对于单变量、连续情景,请参阅 calibr8 论文:《生物技术中的贝叶斯校准、过程建模和不确定性量化》,作者:Laura Marie Helleckes、Michael Osthege、Wolfgang Wiechert、Eric von Lieres、Marco Oldiges

马尔可夫链#

马尔可夫链或马尔可夫过程是一种随机模型,描述了一系列可能的事件,其中每个事件的概率仅取决于前一个事件中达到的状态。

马尔可夫链蒙特卡洛#
MCMC#

马尔可夫链蒙特卡洛 (MCMC) 方法包含一类用于从概率分布中采样的算法。 通过构建一个以所需分布作为其平衡分布的马尔可夫链,可以通过记录链中的状态来获得所需分布的样本。 存在用于构建链的各种算法,包括 Metropolis-Hastings 算法。

最大后验#
MAP#

它是未知量的点估计,等于后验分布的众数。

如果先验分布是平坦分布,则 MAP 方法在数值上等效于最大似然估计 (MLE)。 当先验分布不平坦时,MAP 估计可以被视为 MLE 的正则化版本。

无调转采样器#
NUTS#

一种哈密顿蒙特卡洛的扩展,该算法以算法方式设置可能的目标分布的广泛区域的候选点,并在开始折返并重蹈覆辙时自动停止。

常微分方程#
ODE#

一种微分方程,包含一个或多个自变量的函数以及这些函数的导数

过度离散#

在统计学中,过度离散是指数据集中的变异性比基于给定的统计模型预期的大。

后验#

贝叶斯推断的结果是后验分布,它描述了给定观测数据的情况下,每种可能的参数值组合的相对合理性。 我们可以将后验视为模型看到数据后更新的先验

当使用数值方法获得后验时,我们通常需要首先诊断计算近似值的质量。 这是必要的,例如,像MCMC这样的方法只有渐近保证。 在贝叶斯设置中,可以通过从后验预测分布中采样来模拟预测。 当使用此类预测通过将其与用于推断的观测数据进行比较来检查模型的内部一致性时,该过程称为后验预测检查。

一旦您对模型感到满意,就可以总结和解释后验分布。 后验的常见问题包括:定义的边界的区间、定义的概率质量的区间和点估计。 当后验与先验非常相似时,可用数据不包含有关感兴趣参数的太多信息。

  • 有关生成和解释后验样本的更多信息,请参阅 Richard McElreath 撰写的《统计再思考》第二版,第 3 章。

先验#

原则上,贝叶斯统计允许我们将我们拥有的关于问题结构的所有信息都包含到模型中。 我们可以通过假设模型参数的先验分布来实现这一点。 先验表示在考虑数据之前参数值的合理性。 先验乘以似然性产生后验

先验的信息量可能介于完全不确定性到相对确定性的连续统一体中的任何位置。 信息丰富的先验可能会编码对该参数可能值范围的已知限制。

为了理解先验和似然性的含义,我们可以模拟模型的预测,然后再查看任何数据。 这可以通过从先验预测分布中获取样本来完成。

  • 有关先验的深入指南,请考虑 Richard McElreath 撰写的《统计再思考》第二版,特别是第 2.3 章

概率质量函数#
PMF#

一个函数,它给出离散随机变量恰好等于某个值的概率。

tensor_like#

可以解释为TensorVariable的任何标量或序列。 除了 TensorVariables 之外,这还包括 NumPy ndarray、标量、列表和元组(可能嵌套)。 pytensor.tensor.as_tensor_variable 接受的任何参数都是 tensor_like。

import pytensor.tensor as pt

pt.as_tensor_variable([[1, 2.0], [0, 0]])
TensorConstant(TensorType(float64, shape=(2, 2)), data=array([[1. ... [0., 0.]]))
欠离散#

在统计学中,欠离散是指数据集中的变异性比基于给定的统计模型预期的要小。

unnamed_distribution#

PyMC 分布可以直接初始化(例如 pm.Normal)或使用 .dist 类方法(例如 pm.Normal.dist)。 使用第一种方法初始化的分布注册为模型参数,因此,需要给定一个名称并在模型上下文中初始化。 “unnamed_distributions”是使用第二种方法初始化的分布。 这些是独立的分布,它们不是任何模型中的参数,可以用于从分布本身或作为其他分布(如混合或删失)的参数中抽取样本。

“unnamed_distributions”可以在模型上下文之外使用。 例如

import pymc as pm

unnamed_dist = pm.Normal.dist(mu=1, sigma=2)
pm.draw(unnamed_dist, draws=10)
array([ 0.32001368,  2.59215771,  0.32400771, -0.80347147,  6.19756156,
       -2.59553078,  3.68912763,  6.29400472,  1.27746299, -0.84377345])

尝试在模型上下文之外初始化命名分布会引发 TypeError

import pymc as pm

pm.Normal("variable")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
File ~/checkouts/readthedocs.org/user_builds/pymc/conda/stable/lib/python3.13/site-packages/pymc/distributions/distribution.py:481, in Distribution.__new__(cls, name, rng, dims, initval, observed, total_size, transform, default_transform, *args, **kwargs)
    479     from pymc.model import Model
--> 481     model = Model.get_context()
    482 except TypeError:

File ~/checkouts/readthedocs.org/user_builds/pymc/conda/stable/lib/python3.13/site-packages/pymc/model/core.py:514, in Model.get_context(cls, error_if_none, allow_block_model_access)
    513 if model is None and error_if_none:
--> 514     raise TypeError("No model on context stack")
    515 return model

TypeError: No model on context stack

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
Cell In[3], line 3
      1 import pymc as pm
----> 3 pm.Normal("variable")

File ~/checkouts/readthedocs.org/user_builds/pymc/conda/stable/lib/python3.13/site-packages/pymc/distributions/distribution.py:483, in Distribution.__new__(cls, name, rng, dims, initval, observed, total_size, transform, default_transform, *args, **kwargs)
    481     model = Model.get_context()
    482 except TypeError:
--> 483     raise TypeError(
    484         "No model on context stack, which is needed to "
    485         "instantiate distributions. Add variable inside "
    486         "a 'with model:' block, or use the '.dist' syntax "
    487         "for a standalone distribution."
    488     )
    490 if not isinstance(name, string_types):
    491     raise TypeError(f"Name needs to be a string but got: {name}")

TypeError: No model on context stack, which is needed to instantiate distributions. Add variable inside a 'with model:' block, or use the '.dist' syntax for a standalone distribution.