1.2.2 定义概率

概率值介于0~1(包括0和1),其计算遵循一些法则,其中之一是乘法法则:

  (1.1)

上述表达式中,AB同时发生的概率值等于在B发生的条件下A也发生的概率值乘B发生的概率值,其中表示AB联合概率表示条件概率,二者的现实意义是不同的。例如,路面是湿滑的概率跟下雨时路面湿滑的概率是不同的。条件概率可以大于、小于或等于无条件概率。如果B并不能提供任何关于A的信息,那么,也就是说,只有当AB是相互独立的时候,这个等式才成立。如果事件B能够给出关于事件A的一些信息,那么根据事件B提供的信息不同,事件A可能发生的概率会变得更高或是更低。让我们来看一个简单的例子,掷一个六面骰子的时候,3朝上的概率()是多少呢?答案是1/6,因为每个数字朝上的概率都是相同的。假设已知掷出的骰子是个奇数,那么它是3的概率()是多少呢?答案是1/3,因为我们已经知道它是奇数,那么只有可能是中的某个数,而且每种的概率相同。最后,假设已知掷出的骰子数是个偶数,那么它是3的概率()是多少呢?答案是0,因为我们已经知道这个数是偶数,那么只可能是中的数,因此3不可能出现。

从上面简单的例子可以看出,通过对观测数据进行调节,我们有效地改变了事件原有的概率,也改变了事件的不确定性。条件概率是统计学的核心,不论你要解决的问题是掷骰子还是自动驾驶。

1.概率分布

概率分布是数学中的一个概念,用来描述不同事件发生的可能性,通常这些事件限定在一个集合内,比如{1,2,3,4,5,6},代表了所有可能发生的事件。在统计学里可以这么理解:数据是从某种参数未知的概率分布中生成的。推断,就是根据从这些真实分布中得到的样本(也称作数据集)找出那些参数。通常我们没法直接获取真实的概率分布,只能退而求其次,设计出一个模型来逼近真实的分布。概率模型就是通过恰当地组合概率分布得到的。

提示:注意,通常我们并不知道模型是否正确,因此需要对模型做评估以便获得信心并说服他人我们的模型是适合所要探索或解决的问题的。

如果一个变量X可以用一个概率分布来描述,那么我们把X称为一个随机变量。通常,人们用大写的字母来表示随机变量(比如X),用小写的字母来表示随机变量的一个实例(比如x)。x可以是一个向量,因此可以包含很多独立的值,比如。下面用Python来看一个例子,我们的真实分布是一个正态分布(或者也叫高斯分布),均值为,标准差为。这两个参数准确无误地刻画了一个正态分布。使用SciPy,可以通过stats.norm(μ,σ)定义一个符合正态分布的随机变量X,然后可以通过rvs方法得到一个实例x,下面的例子中,得到了3个值。

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

你会发现,每次执行上面的代码,你都会得到不同的随机结果。一旦一个分布的参数确定了,那么x的取值概率也就确定了,唯一随机的是每次实验所得到的x是随机的。关于随机性的定义有一个常见的误解,即可以从一个随机变量中得到任意可能的值,或者所有的值都是等概率的。实际上,一个随机变量可以取到的值以及对应的概率是严格受到概率分布控制的,而随机性只是因为我们无法准确预测每一次试验的结果值。每次执行上面的代码,都会得到3个不同的值,但如果重复执行上千次之后,根据经验可以检查样本的均值会在0附近,并且95%的样本会落在[−1.96,+1.96]内。这里请不要这么果断地相信我的结论,用你的Python技巧实际验证一下。如果你学过与正态分布有关的数学知识,这里就会获得一致的结论。

统计学中,用来描述一个变量服从参数为的正态分布的写法如下:

  (1.2)

这里的波浪线~表示服从于某种分布。

提示:在大多数书中,正态分布用方差而不是标准差来表示,因此人们会写成。本书将使用标准差,首先是因为这样更容易解释,其次是因为PyMC3中也是这样表示的。

本书会涉及多个概率分布,每次介绍一个新的分布时,都会先花点时间介绍它。我们从正态分布开始介绍是因为它几乎是概率分布之源。一个变量如果服从正态分布,那么它的概率值可以用下面的表达式来描述:

  (1.3)

这就是正态分布的概率密度函数,你不用记住这个表达式,给你看这个表达式只是想让你知道这些数字是从哪里来的。前面已经提到过,是正态分布的两个参数,这两个参数的值一旦确定就完全定义了一个正态分布,可以看到,式(1.3)中的其他值都是常量。可以是任意实数,即,其决定了正态分布的均值(同时还有中位数和众数,它们都相等)。是标准差,其取值只能为正,描述了正态分布的分散程度,取值越大,分布越分散。由于有无限种组合,因此高斯分布的实例也就有无限多种,所有这些分布属于同一个高斯分布族

虽然数学公式这种表达形式简洁明了,甚至有人说它很美,不过得承认第一眼看到公式的时候还是不够直观,尤其是数学不太好的人。我们可以尝试用Python代码将公式的含义重新表示出来。先来看看高斯分布都长什么样。

mu_params = [-1, 0, 1]
sd_params = [0.5, 1, 1.5]
x = np.linspace(-7, 7, 200)
_, ax = plt.subplots(len(mu_params), len(sd_params), sharex=True,
                     sharey=True,
                     figsize=(9, 7), constrained_layout=True)
 
for i in range(3): 
    for j in range(3):
        mu = mu_params[i]
        sd = sd_params[j]
        y = stats.norm(mu, sd).pdf(x) 
        ax[i,j].plot(x, y)
       ax[i,j].plot([], label="μ = {:3.2f}\nσ = {:3.2f}".format(mu, sd),                          alpha=0)
        ax[i,j].legend(loc=1) 
ax[2,1].set_xlabel('x')
ax[1,0].set_ylabel('p(x)', rotation=0, labelpad=20)
ax[1,0].set_yticks([])

上面的代码主要是为了画图,其中与概率相关的部分是y = stats.norm(mu, sd).pdf(x)x服从参数为musd的正态分布,这行代码的作用是为一组x值计算其对应的概率密度。上面的代码会生成图1.1,每个子图中,用蓝色的线表示不同值对应的正态分布。

图1.1

提示:本书大部分图是通过图前面的代码直接生成的,尽管有些时候并没有直接说明。对熟悉Jupyter Notebook或者Jupyter Lab的读者来说应该会很熟悉。

随机变量分为两种,连续变量离散变量。连续随机变量可以从某个区间内取任意值(可以用Python中的浮点型数据来表示),而离散随机变量则只能取某些特定的值(可以用Python中的整型数据来描述)。正态分布属于连续分布。

需要注意的是,生成图1.1的代码中省略了yticks,这是一个功能而非Bug。省略的原因是,这些值并没有提供太多有用的信息,反而有可能使某些人产生困惑。让我来解释下,y轴的数据其实不太重要,重要的是它们的相对值。假设从变量x中取两个值,比方说xixj,然后发现(在图中两倍高),我就可以放心地说,xi的概率值是xj的两倍,这就是大多数人直观的理解(幸运的是,这也是正确的理解)。唯一棘手的地方在于,对于连续分布,y轴上的值并非表示概率值,而是概率密度。想要得到概率值,需要在给定区间内做积分,也就是说,需要计算(针对该区间的)曲线下方的面积。虽然概率不能大于1,但是概率密度却可以大于1,只不过其密度曲线下方的总面积限制为1。从数学的角度来看,理解概率和概率密度之间的差别非常重要。不过本书采用的是偏实践的方法,可以稍微简单些,毕竟只要你能根据相对值解释图表,这种差别就没有那么重要了。

2.独立同分布

很多模型假设随机变量的连续值都是从同一分布中采样的,并且这些值相互独立。在这种情况下,我们称这些变量为独立同分布变量。用数学符号来描述的话就是:如果两个随机变量xy对于所有可能的取值都满足,那么称这两个变量相互独立。

非独立同分布变量的一个常见示例是时间序列,其中随机变量中的时间相关性是一个应该考虑的关键特性。下面例子中的数据记录了从1959年到1997年大气中二氧化碳的含量。可以用代码把图画出来。

data = np.genfromtxt('../data/mauna_loa_CO2.csv', delimiter=',')
plt.plot(data[:,0], data[:,1]) 
plt.xlabel('year') 
plt.ylabel('$CO_2$ (ppmv)')
plt.savefig('B11197_01_02.jpg', dpi=300)

图1.2

图1.2中的数据对应每个月测得的大气中二氧化碳的含量,可以很明显地看出数据的时间相关性。实际上,这里有两种趋势:一种是季节性的,这与植物周期性生长和衰败有关;另一种是整体性的,这表明大气中二氧化碳浓度在不断增加。

3.贝叶斯定理

现在我们已经学习了概率论中的一些基本概念和术语,接下来就是激动人心的时刻了。话不多说,让我们以庄严的姿态思考贝叶斯定理:

  (1.4)

这看起来稀松平常,似乎跟小学课本里的公式差不多?用Richard Feynman的话来说:“这就是关于贝叶斯统计的所有知识。”

学习贝叶斯定理的来源将有助于我们理解它的含义。根据式(1.1)有:

  (1.5)

也可以写成:

  (1.6)

假设式(1.5)和式(1.6)的左边是相等的,那么可以合并起来得到下面的式子:

  (1.7)

重新把式(1.7)组织一下,就得到了式(1.4),即贝叶斯定理。

现在让我们看看式(1.4)的含义,理解它为什么重要。首先,它表明不一定和是一样的。这一点非常重要,在日常分析中,即使是系统学习过统计学和概率论的人也很容易忽略这点。我们举个简单例子来说明为什么二者不一定相同:一个阿根廷人成为教皇的概率和一个教皇是阿根廷人的概率并不相同。因为假设有44 000 000个阿根廷人,而只有一个是教皇,所以有p(教皇|阿根廷人)≈1/44 000 000而p(阿根廷人|教皇)=1。

如果用假设代替,用数据代替y,那么贝叶斯定理告诉我们的是,给定数据y,如何计算一个假设 的概率。你会在很多地方见到这种关于贝叶斯定理的解释,但是我们怎么把一个假设转换成可以放入贝叶斯定理中的东西呢?可以通过概率分布来实现。通常来讲,我们所说的假设是一个非常狭隘的假设。如果我们讨论为模型中的参数找到一个合适的值,即概率分布的参数,这会更精确。顺便说一点,不要试图把 设定为诸如“独角兽真的存在”等这类命题,除非你真的愿意构建一个关于独角兽真实存在的概率模型!

贝叶斯定理是贝叶斯统计的核心,我们将在第2章中看到,使用PyMC3等工具可以让我们在每次构建贝叶斯模型的时候都不必显式地编写贝叶斯定理。尽管如此,了解贝叶斯定理各个部分的名字还是非常重要的,因为后面它们会被反复提及。此外,理解各个部分的含义也有助于对模型进行概念化。

:先验。

:可能性、似然。

:后验。

:边缘似然、证据。

先验分布反映的是在观测到数据y之前对参数 的了解。如果我们对参数一无所知,那么可以用扁平先验(它不会传递太多信息)。读完本书后你会发现,通常我们能做到的要比扁平先验更好。为什么有些人会认为贝叶斯统计是主观的,原因就是使用了先验,先验不过是构建模型时的另一个假设,与任何其他假设是一样的主观(或客观)。

似然是指如何在分析中引入数据,它表达的是给定参数的数据合理性。在一些文章中,你会发现有些人也称之为采样模型统计模型或者就叫模型。本书坚持使用似然这一名称。

后验分布是贝叶斯分析的结果,反映的是(在给定数据和模型的条件下)我们对问题的全部了解。后验指的是模型中参数的概率分布而不是单个值,这种分布是先验与似然之间的平衡。有这么个有名的笑话:“‘贝叶斯人’是这样的:他模糊地期待着一匹马(先验),并瞥见了一头驴(边缘似然),结果他坚信看到的是一头骡子(后验)。”对这个笑话的解释是如果似然和先验都是模糊的,那么也会得到一个模糊的后验。不管怎么说,我喜欢这个笑话,因为它讲出了这样一个道理,后验其实是对先验和似然的某种折中。从概念上讲,后验可以看作在观测到数据之后对先验的更新。事实上,一次分析中的后验,在收集到新的数据之后,也可以看作下一次分析中的先验。这使得贝叶斯分析特别适用于序列化的数据分析,比如实时处理来自气象站和卫星的数据以进行灾害预警,要了解更详细的内容,可以阅读机器学习方面的算法。

最后一个概念是边缘似然,也称作证据。正式地讲,边缘分布是在模型的参数取遍所有可能值的条件下得到指定观测值的概率的平均。不过,本书的大部分内容并不关心这个概念,我们可以简单地把它当作归一化系数。这么做没什么大问题,因为我们只关心参数的相对值而非绝对值。你可能还记得我们在1.2.2节讨论如何解释概率分布图时提到过这一点。把证据这一项忽略掉之后,贝叶斯定理可以表示成如下正比例形式:

  (1.8)

理解贝叶斯定理中的每个概念可能需要点儿时间和更多的例子,本书剩余部分也将围绕这些内容展开。