贝叶斯推理:基本概念
最近在读这本书,《Bayesian Methods for Hackers : Probabilistic Programming and Bayesian Inference》,即《贝叶斯方法的高级用法:概率编程和贝叶斯推理》,作者是 Cameron Davidson-Pilon。
概率统计是机器学习、深度学习等人工智能技术的基础理论之一;贝叶斯推理是概率统计实用价值最大的组成部分之一。
本书用代码和图表实例化、形象化地阐释贝叶斯推理,避开了数学公式的生硬呆板、繁难枯燥的说教,使得人们能看懂代码和图表就能理解贝叶斯推理的具体方法。
感觉书写得不错,能读懂、受启发、有收获,所以把一些心得体会记下来、说出去,但愿对别人也有用。
先把本书阐述贝叶斯推理的基本观点罗列如下:
1. 贝叶斯方法是数据专家(data scientist)使用的诸多工具之一。它可用于预测、分类、分级、推理、识别垃圾邮件,等等。
2. 贝叶斯学派认为概率是对某一事件的发生相信的程度,是对这一信念强弱的度量。
3. 为了兼容传统概率论,贝叶斯学派把对事件AA 的信念记作 ,并称作先验概率。
4. 新的证据XX出现后,对事件 的信念记作P(A|X)P(A|X) ,并称作后验概率。
5. 贝叶斯推理的结果有2个值:事件AA 为真和假两个概率(例如,分别为0.8与0.2)。传统概率学派的频率方法只有事件 为真的一个值。
6. 在证据较少时,贝叶斯推理优于依赖大数据集的频率方法。
贝叶斯定理是这般模样:
这一公式用数学描述了客观事实,并非只供贝叶斯推理专用。贝叶斯推理只是将先验概率 P(A)P(A) 与更新了的后验概率 P(A|X)P(A|X) 联系在一起。
用法示例:他是农民还是图书管理员
假定某地的男性农民与男性图书管理员的比例为 20:1。王强是当地的一名男性,从平时的行为举止看,他像是图书管理员,但从统计学上看,他更可能是农民。真相如何,可用贝叶斯推理来分析。
假定当地只有农民和图书管理员这两种职业。
用 AA 表示王强是图书管理员。如果没有关于王强的其他信息,则 。这是先验概率。
假定有邻居提供了关于王强的信息 XX 。我们关心的则是后验概率 。
回到上述的贝叶斯定理。我们已经知道了 P(A)P(A) 的值,还需确定 P(X|A)P(X|A) 与 P(X)P(X) 的值。
若邻居说王强是图书管理员,P(X|A)P(X|A) 表示的是这个说法为真的概率。它的值接近 1.0,比如 0.95。
邻居可能说王强是图书管理员,也可能说不是。P(X)P(X) 表示的是邻居提供信息,说王强是或不是图书管理员的概率。
P(X)P(X) 的计算公式是:
∼A∼A 表示王强不是图书管理员,而是农民。我们已知 P(X|A)P(X|A) 、P(A)P(A) 和 P(∼A)=1−P(A)=20/21P(∼A)=1−P(A)=20/21 ,现在只需弄清 P(X|∼A)P(X|∼A),即邻居说王强是农民的概率。假设它的值为 0.5,于是,P(X)=0.95∗(1/21)+(0.5)∗(20/21)=0.52P(X)=0.95∗(1/21)+(0.5)∗(20/21)=0.52 。
把上述各项值代入贝叶斯定理:
结果,王强是图书管理员的后验概率为 0.087。这个估值不算太高,但考虑到一个人是图书管理员的先验概率是 1/20,或 0.0476,后验概率也是合乎逻辑的。但是,王强是农民的可能,依然远大于是图书管理员的可能。
下面的代码,把以上文字描述转成可视化图形,对于王强是农民或图书管理员的先验概率与后验概率作出对照比较。
%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");