本节书摘来异步社区《贝叶斯方法:概率编程与贝叶斯推断》一书中的第1章,第1.2节,作者:【加】Cameron Davidson-Pilon(卡梅隆 戴维森-皮隆),更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 我们的贝叶斯框架
我们感兴趣的估计,可以通过贝叶斯的思想被解释为概率。我们对事件A有一个先验估计——例如,在准备测试之前,我们对代码中的漏洞就有了一个先验的估计。
接下来,观察我们的证据。继续拿代码漏洞为例:如果我们的代码通过了X个测试,我们会相应地调整心里的估计。我们称这个调整过后的新估计为后验概率。调整这个估计值可以通过下面的公式完成,这个公式被称为贝叶斯定理,得名于它的创立者托马斯·贝叶斯。
上面的公式并不等同于贝叶斯推论,它是一个存在于贝叶斯推论之外的数学真理。在贝叶斯推论里它仅仅被用来连接先验概率P(A)和更新的后验概率P(A|X)。
1.2.1 不得不讲的实例:抛硬币
几乎所有统计书籍都包含一个抛硬币的实例,那我也从这个开始着手吧。假设你不确定在一次抛硬币中得到正面的概率(剧透警告:它是50%),你认为这里肯定是存在某个比例的,称之为p,但是你事先并不清楚p大概会是多少。
我们开始抛硬币,并记录下每一次抛出的结果——正面或反面,这就是我们的观测数据。一个有趣的问题是:“随着收集到越来越多的数据,我们对p的推测是怎么变化的呢?”
说得更具体一些,当面对着很少量的数据或拥有大量数据时,我们的后验概率是怎么样的呢?下面,我们按照观测到的越来越多的数据(抛硬币数据),逐次更新我们的后验概率图。
在图中我们用曲线表示我们的后验概率,曲线越宽,我们的不确定性越大。如图1.2.1所示,当我们刚刚开始观测的时候,我们的后验概率的变化是不稳定的。但是最终,随着观测数据(抛硬币数据)越来越多,这个概率会越来越接近它的真实值p=0.5(图中用虚线标出)。
注意到图中的波峰不一定都出现在0.5那里,当然它也没有必要都这样。应该明白的是我们事前并不知道p会是多少。事实上,如果我们的观测十分的极端,比如说抛了8次只有1次结果是正面的,这种情况我们的分布会离0.5偏差很多(如果缺少先验的知识,当出现8次反面1次正面时,你真的会认为抛硬币结果是公平的吗?)。随着数据的累积,我们可以观察到,虽然不是每个时候都这样,但越来越多地,概率值会出现在p=0.5。
下面这个实例就简单地从数据角度演示一下贝叶斯推断。
1.2.2 实例:图书管理员还是农民
下面这个故事灵感来自于Daniel Kahneman的《思考,快与慢》一书,史蒂文被描述为一个害羞的人,他乐于助人,但是他对其他人不太关注。他非常乐见事情处于合理的顺序,并对他的工作非常细心。你会认为史蒂文是一个图书管理员还是一个农民呢?从上面的描述来看大多数人都会认为史蒂文看上去更像是图书管理员,但是这里却忽略了一个关于图书管理员和农民的事实:男性图书管理员的人数只有男性农民的1/20。所以从统计学来看史蒂文更有可能是一个农民。
怎么正确地看待这个问题呢?史蒂文实际上更有可能是一个农民还是一个图书管理员呢?把问题简化,假设世上只有两种职业——图书管理员和农民,并且农民的数量确实是图书管理员的20倍。
设事件A为史蒂文是一个图书管理员。如果我们没有史蒂文的任何信息,那么P(A)=1/21=0.047。这是我们的先验。现在假设从史蒂文的邻居们那里我们获得了关于他的一些信息,我们称它们为X。我们想知道的就是P(A|X)。由贝叶斯定理得:
我们知道P(A)是什么意思,那P(X|A)是什么呢?它可以被定义为在史蒂文真的是一个图书管理员的情况下,史蒂文的邻居们给出的某种描述的概率,即如果史蒂文真的是一个图书管理员,他的邻居们将他描述为一个图书管理员的概率。这个值很可能接近于1。假设它为0.95。
P(X)可以解释为:任何人对史蒂文的描述和史蒂文邻居的描述一致的概率。现在这种形式有点难以理解,我们将其做一些逻辑上的改造:
其中~A表示史蒂文不是一个图书管理员的事件,那么他一定是一个农民。现在我们知道P(X|A)和P(A),另外也可知P(~A)=1-P(A)=20/21。现在我们只需要知道P(X|~A),即在史蒂文为一个农民的情况下,史蒂文的邻居们给出的某
种描述的概率即可。假设它为0.5,这样,
结合以上:
这个值并不算高,但是考虑到农民的数量比图书管理员的数量多这么多,这个结果也非常合理了。在图1.2.2中,对比了在史蒂文为农民和史蒂文为图书管理员时的先验和后验概率。
%matplotlib inline
from IPython.core.pylabtools import figsize
import numpy as np
from matplotlib import pyplot as plt
figsize(12.5, 4)
plt.rcParams['savefig.dpi'] = 300
plt.rcParams['figure.dpi'] = 300
colors = ["#348ABD", "#A60628"]
prior = [1/21., 20/21.]
posterior = [0.087,1-0.087]
plt.bar([0, .7], prior, alpha=0.70, width=0.25,
color=colors[0], label="prior distribution",
lw="3", edgecolor="#348ABD")
plt.bar([0+0.25, .7+0.25], posterior, alpha=0.7,
width=0.25, color=colors[1],
label="posterior distribution",
lw="3", edgecolor="#A60628")
plt.xticks([0.20, 0.95], ["Librarian", "Farmer"])
plt.title("Prior and posterior probabilities of Steve's\
occupation")
plt.ylabel("Probability")
plt.legend(loc="upper left");```
在我们得到X的观测值之后,史蒂文为图书管理员的概率增加了,虽然增加的不是很多,史蒂文为农民的可能性依旧是相当大的。
这是一个关于贝叶斯推断和贝叶斯法则的一个简单的实例。不幸的是,除了在人工结构的情况下,要执行更加复杂的贝叶斯推断所使用到的数学只会变得更加的复杂。在后面我们将看到执行这种复杂的属性分析并没有必要。首先,我们必须扩充我们的建模工具。下一章的概率分布,如果你已经对它很熟悉了,可以选择跳过(或只是浏览一下),但是对于不熟悉的读者,下一章是很有必要的。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/4b85e09b5edce751598572df5b6dd09064f5de3f.png" width="" height="">