Python贝叶斯分析(第2版)
上QQ阅读APP看书,第一时间看更新

前言

贝叶斯统计距今已经有超过250年的历史,其间该方法既饱受赞誉又备受轻视。直到近几十年,得益于理论进步和计算能力的提升,贝叶斯统计才越来越多地受到来自统计学以及其他学科乃至学术圈以外工业界的重视。现代的贝叶斯统计主要是计算统计学,人们对模型的灵活性、透明性以及统计分析结果的可解释性的追求最终造就了该趋势。

本书将从实用的角度来介绍贝叶斯统计,不会太在意其他统计范式及其与贝叶斯统计的关系。本书的目的是介绍如何做贝叶斯数据分析,尽管与之相关的哲学讨论也很有趣,不过受限于篇幅,这部分内容并不在本书的讨论范围之内,有兴趣的读者可以通过其他方式深入了解。

这里我们采用建模的方式介绍统计学,介绍如何从概率模型的角度思考问题,并应用贝叶斯定理来推导模型和数据的逻辑结果。这种建模方式是可编程的,其中,模型部分会用PyMC3和ArviZ编写。PyMC3是用于贝叶斯统计的Python库,它为用户封装了大量的数学细节和计算过程。ArviZ是一个用于贝叶斯模型探索式分析的Python库。

贝叶斯方法在理论上以概率论为基础,很多介绍贝叶斯方法的书都充斥着复杂的数学公式。学习统计学方面的数学知识显然有利于构建更好的模型,同时还能让你对问题、模型和结果有更好的把握。不过类似PyMC3的库能够帮助你在有限的数学知识水平下学习并掌握贝叶斯统计。在阅读本书的过程中,你将亲自见证这一过程。

读者对象

如果你是一名学生、数据科学家、自然科学或者社会科学的研究人员或者开发人员,想要着手贝叶斯数据分析和概率编程,那么本书就是为你准备的。本书是入门级的,因此并不需要你提前掌握统计知识,当然,有一点儿Python和NumPy的使用经验就更好了。

本书结构

第1章,概率思维。本章介绍贝叶斯统计的基本概念及其在数据分析中的意义。本章包含本书其余章节中用到的基本思想。

第2章,概率编程。本章从编程的角度重新回顾第1章提到的概念,并介绍PyMC3和ArviZ。PyMC3是一个概率编程库,ArviZ是一个用于贝叶斯模型探索性分析的Python库。此外,本章还将用几个例子解释分层模型。

第3章,线性回归建模。线性回归是构建更复杂模型的基石,有着广泛的应用,本章将涵盖线性模型的基础部分。

第4章,广义线性模型。本章介绍如何将线性模型扩展到高斯分布之外的其他分布,为解决许多数据分析问题“打开大门”。

第5章,模型比较。本章讨论如何使用WAIC、LOO和贝叶斯因子来比较、选择和平均模型,同时讨论这些方法的一般注意事项。

第6章,混合模型。本章讨论如何通过混合简单的分布来构建更复杂的分布以增加模型的灵活性。本章还会介绍本书的第一个非参模型——狄利克雷过程。

第7章,高斯过程。本章涵盖高斯过程背后的基本思想,以及如何使用它们在函数上构建非参数模型,从而解决一系列的问题。

第8章,推断引擎。本章介绍数值逼近后验分布的方法,同时讨论一个从使用者的角度来说非常重要的主题——如何诊断后验估计的可靠度。

第9章,拓展学习。最后一章列出一系列继续深入学习的资料以及一段简短的演讲。

准备工作

本书的代码采用Python 3.6编写,要安装Python及各种Python库,我建议用Anaconda,这是一个用于科学计算的软件,可以从Anaconda官网下载。Anaconda会在你的系统上安装很多非常有用的Python库。此外,你还需要安装两个库。首先,用conda命令安装PyMC3:

conda install -c conda-forge pymc3

然后用下面的命令安装ArviZ:

pip install arviz

另一种方式是你可以安装本书所有必需的Python库:安装Anaconda之后可以从本书配套源码文件中找到一个bap.yml文件,然后用下面的命令安装所有必需的库:

conda env create -f bap.yml

本书用到的Python库列举如下。

IPython 7.0。

Jupyter 1.0 (或Jupyter-lab 0.35)。

NumPy 1.14.2。

SciPy 1.1。

pandas 0.23.4。

Matplotlib 3.0.2。

Seaborn 0.9.0。

ArviZ 0.3.1。

PyMC3 3.6。

对于每章的代码部分,如果你安装了上面的这些库,那么与其从本书复制并粘贴代码运行,不如直接从异步社区网站的本书页面下载代码,然后用Jupyter Notebook或者Jupyter Lab运行。我会为PyMC3或ArviZ的新版本更新GitHub上面的代码。如果你在运行本书相关代码的过程中发现任何技术问题、语法错误或者任何其他错误,可以直接在上面的链接里提问,我会尽快解答。

本书的大多数图或表格都是用代码生成的,你会发现,一般一段代码后面都会跟着这段代码生成的图或表格,希望这种方式能够让熟悉Jupyter Notebook或者Jupyter Lab的读者感到亲切,但愿这样做不会让读者感到困惑。

格式约定

本书遵照一些文本编排的惯例。

代码中的单词、文件名或函数名在正文段落中仍以代码体呈现。

代码片段的格式一般如下:

μ = 0.
σ = 1.
X = stats.norm(μ, σ)
x = X.rvs(3)

粗体:标明一个新的词汇,或者重要的词。