前言

贝叶斯统计这个名字归功于长老会牧师兼业余数学家托马斯·贝叶斯(Thomas Bayes,1702--1761),他第一次推导出了被后人所知的贝叶斯定理,该定理于其死后的 \(1763\) 年发表。但真正开发贝叶斯方法的第一人是 Pierre-Simon Laplace (1749--1827),因此我们将之称为拉普拉斯统计也许更合理一些。尽管如此,我们将尊重斯蒂格勒的同名法则并坚持传统,在本书的其余部分中以贝叶斯方法命名。

从贝叶斯和拉普拉斯(以及许多其他人)的开创性时代至今,发生了很多事情,特别是开发了很多新想法,其中大部分是由计算机技术推动和/或实现的。本书的目的是提供一个关于此主题的现代视角,从 “打基础的基本知识” 到 “现代贝叶斯工作流和工具的使用”。

我们写这本书是为了帮助初学的贝叶斯从业者成为中级建模者。我们并不是说这在你读完本书后会自动发生,但我们希望这本书能够引导你朝着一个富有成效的方向发展。

特别指出,本书面向对应用贝叶斯模型解决实际数据分析问题感兴趣的贝叶斯从业者。通常,学术界和工业界是有区别的。但本书没有做这样的区分,因为它对大学的学生和公司的机器学习工程师同样有用。

我们的目标是:在完成本书后,你不仅能够熟悉 贝叶斯推断,而且还能轻松地进行 贝叶斯模型的探索性分析,包括模型比较、模型诊断、模型评估和结果交流等。

我们计划从现代计算的角度教授这些内容。对我们来说,如果采用计算方法,贝叶斯统计会被更好地理解和应用。举例来说,我们更关注经验主义地检查假设被推翻的原因,而不是试图从理论上证明假设是正确的。这也意味着我们会使用许多可视化的表达手段。随着逐页阅读,建模方法的其他含义将会逐步变清晰。

我们在书中使用 Python 编程语言。更具体地说,我们将主要使用 PYMC3 [1]TensorFlow Probability (TFP) [2] 作为模型构建和推断的主要概率编程语言,并使用 ArviZ 作为贝叶斯模型探索性分析的主要软件库 [3]。我们不打算对本书中的所有 Python 概率编程语言进行详尽调研和比较,因为选择较多而且发展迅速。相反,我们会专注于贝叶斯分析的实践方面。

编程语言和软件包只是通往目的地的桥梁。

我们为本书选择的编程语言是 Python,书中选择使用的软件包很少,而且书中涵盖的统计和建模概念基本与编程语言和软件包无关,可以应用于许多计算机编程语言,例如 R、Julia 和 Scala 等。因此,具有上述编程语言基础但不了解 Python 的读者,也可以从本书的阅读中受益。当然,如果能够在自身熟悉的编程语言中找到等效功能的软件包进行实践最好。此外,我们鼓励其他人将这项工作中的 Python 示例代码转换为其他编程语言或框架。

预先知识储备

当我们撰写本书以帮助初学者向中级从业者转变时,假设读者事先接触过贝叶斯统计的基本思想( 如先验、似然和后验 ),以及一些基本统计概念( 如随机变量、概率分布、期望等 )。对于那些有点生疏的人,我们在 第 11 章 中提供了一个完整的摘要,对基本统计概念进行了复习。

几本更深入地解释这些概念的好书是 《 Understanding Advanced Statistical Methods 》 [4] 和 《Introduction to Probability》 [5]。后者更具理论性,但两者都比较重视应用。

如果你对统计学有很好的理解,但从未接触过贝叶斯统计学,那么你也可以将本书作为对该主题的简介,只是开始几章( 主要是前两章 )的节奏会有点快,可能需要通读几次。

我们希望你能够熟悉一些数学概念,例如:积分、导数和对数的性质等,写作水平最好能够达到大学第一学年以上的水平。对于那些需要复习这些数学概念的人,我们推荐 3Blue1Brown 1 的系列视频。我们不会要求你做过多数学练习,而是要求你使用代码和交互式计算环境来理解和解决问题。只有当有助于更好地理解贝叶斯统计建模时,书中才会使用数学公式。

本书假定读者具备一定的计算机编程能力。我们使用 Python 语言,并使用一些专门的软件包,特别是概率编程语言。在阅读本书之前,至少利用概率编程语言拟合一个模型,对你会有帮助,但也不是必须的。关于如何设置本书所需计算环境的参考,请阅读 环境安装

阅读方法

我们将使用 玩具模型 来理解一些重要概念,而不是让数据模糊了主要概念;然后使用真实数据集来逼近一些实践中会面临的实际问题,例如采样问题、重参数化、先验/后验校准等。我们鼓励你在阅读本书时,在交互式编程环境中运行这些模型。

强烈建议你阅读和使用各种软件包的在线文档。尽管我们已经尽最大努力使本书自成一体,但在线上还有大量关于这些工具的文档,参考这些文档会有助于学习本书,并帮助你使用这些工具。

第 1 章 提供了对贝叶斯推断中基本和核心概念的复习或快速介绍。该章中的概念将在本书其余部分进行重新审视和应用。

第 2 章 介绍了贝叶斯模型的探索性分析。即介绍了许多属于贝叶斯工作流但并非推断本身的概念。我们将在本书其余部分应用并重新审视该章中的概念。

第 3 章 是第一个介绍特定模型架构的章节。它介绍了线性回归模型,并为接下来的第 \(5\) 章奠定了基础。第 \(3\) 章还全面介绍了本书中使用的主要概率编程语言 PYMC3 和 TFP

第 4 章 扩展了线性回归模型,并讨论了更高级的主题,如鲁棒回归、分层模型和模型重参数化。本章会使用 PYMC3 和 TFP

第 5 章 介绍了基函数,特别是样条作为线性模型的扩展,使我们能够构建更灵活的模型。本章使用 PYMC3。

第 6 章 侧重于时间序列模型,从将时间序列建模为回归模型,到更复杂的模型,如 ARIMA线性高斯状态空间模型。本章使用 TFP 概率编程语言。

第 7 章 介绍了名为贝叶斯加性回归树的非参数模型。我们讨论了这个模型的可解释性和变量的重要性。本章使用 PYMC3 。

第 8 章 将注意力聚焦在近似贝叶斯计算框架上,该框架对于没有明确似然函数的问题非常有用。本章使用 PYMC3 。

第 9 章 概述了端到端的贝叶斯工作流。它展示了商业应用中的观测性研究和科研环境中的实验性研究。本章使用 PYMC3。

第 10 章 深入探讨了概率编程语言。本章展示了各种不同的概率编程语言。

第 11 章 为阅读其他章节提供辅助作用,其中的主题彼此松散相关,因此你可以有选择地阅读。

高亮文本

本书中的文字将用粗体斜体突出强调。 粗体字将突出新概念或概念的重点。 斜体文字表示口语或不严谨的表达方式。当提到特定代码时,也会突出显示,例如:pm.sample

源代码

书中的代码块用阴影框标记,左侧有行号。并使用章节编号后跟代码块编号进行引用。

例如:

for i in range(3):
    print(i**2)
 0 1 4

每次看到代码块时都会想查看运行结果。这通常会体现为一张图、一个数字、一份代码输出或一个表格。反之,书中大部分图都有相关的代码块,有时我们会省略书中的代码块以节省篇幅,但你可以在 GitHub 存储库 中访问完整代码。

该存储库还包括一些练习用的附加材料。该存储库中的 notebook 还可能包含书中未见但用于开发书中所见模型的其他图形、代码或输出。 GitHub 中还包含如何创建标准计算环境的说明。

方框

我们使用方框来提供关于重要的统计、数学或编程概念的快速参考。我们还会提供参考资料供你继续学习该主题。例如:

中心极限定理

在概率论中,中心极限定理确定,在某些情况下,当添加独立随机变量时,即使原始变量本身不是高斯分布,它们的适当归一化总和也会趋于高斯分布。

\(X_1, X_2, X_3, ...\) 独立同分布,均值为 \(\mu\) ,标准差为 \(\sigma\)。当 \(n \rightarrow \infty\) 时,有:

\[\sqrt{n} \left(\frac{\bar{X}-\mu}{\sigma} \right) \xrightarrow{\text{d}} \mathcal{N}(0, 1)\]

《 Introduction to Probability 》 [5] 这本书是学习概率基础理论的好资源,其内容在实践中很有用。

import 代码

在本书中,我们导入 Python 包时使用以下约定:

# Basic 

import numpy as np 
from scipy import stats 
import pandas as pd 
from patsy import bs, dmatrix 
import matplotlib.pyplot as plt

# Exploratory Analysis of Bayesian Models 
import arviz as az 

# Probabilistic programming languages 
import bambi as bmb 
import pymc3 as pm 
import tensorflow_probability as tfp 

tfd = tfp.distributions 

# Computational Backend 
import theano 
import theano.tensor as tt 
import tensorflow as tf

我们还会使用 ArviZ 的一些预定义风格 az.style.use("arviz-grayscale")

与本书交互

我们的观众不仅仅是贝叶斯读者,更是贝叶斯实践者。

我们将提供材料来练习贝叶斯推断和贝叶斯模型的探索性分析。由于利用计算和代码是现代贝叶斯从业者所需的核心技能,因此我们将为你提供可以在多次尝试中建立直觉的示例。

我们的期望是本书代码被读者阅读、执行、修改,并再次执行多次。我们只能在本书中展示有限示例,但你可以使用计算机为自己制作无限数量的示例。通过这种方式,你不仅可以学习统计概念,还可以学习如何使用计算机让这些概念产生价值。

计算机还将使你摆脱印刷文本的限制,例如缺乏颜色、缺乏动画和并排比较。

现代贝叶斯从业者利用监视器和快速可计算“双重检查”提供的灵活性,我们专门创建了示例以允许相同级别的交互性。我们在每一章的末尾都包含了测试你学习和实践的练习。练习标记为简单 (E)中等 (M)困难 (H),可根据需要酌情提供解答。

致谢

感谢我们的朋友和同事,他们提供了大量时间和精力来阅读早期书稿,提出并提供了有用的反馈,帮助我们改进了本书,也帮助我们修复了书中的许多错误。非常感谢:

Oriol Abril-Pla、Alex Andorra、Paul Anzel、Dan Becker、Tomás Capretto、Allen Downey、Christopher Fonnesbeck、Meenal Jhajharia、Will Kurt、Asael Matamoros、Kevin Murphy 和 Aki Vehtari。


1

https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw, 即使你不需要复习,也推荐你看一下这些视频。