贝叶斯简介

2018-06-21 Thursday    


贝叶斯定理 (Bayes’ Theorem) 是英国数学家 托马斯·贝叶斯 (Thomas Bayes) 在 1763 年发表的一篇论文中首次提出;而贝叶斯推断 (Bayesian Inference) 是贝叶斯定理的一种应用,是一种统计学方法,用来估计统计量的某些性质。

这里简单介绍其基本概念。

简介

在统计学界一直有两种观点:A) 频率学派;B) 贝叶斯学派。

贝叶斯推断与统计学的推断方法不同,是建立在主观判断的基础上,也就是说,可以不需要客观证据,先估计一个值,然后根据实际结果不断修正。正是因为它的主观性太强,曾经遭到许多统计学家的诟病,很长时间内无法广泛应用。

在计算机获得广泛发展后,人们也逐渐意识到,许多统计量是无法事先进行客观判断的,而利用互联网中的大型数据集,可以不断更新完善模型,从而为应用贝叶斯推断创造了条件。

贝叶斯学派的思想是用数据来更新特定假设的概率。

贝叶斯定理

贝叶斯定理实际上是条件概率的一种推断。

条件概率 Conditional Probability

是指在 已知 事件 A 发生的情况下,此时事件 B 发生的概率,这里用 P(B|A) 来表示,此时的表达式可以表示为 P(B|A)=P(AB)/P(A)

例如,将一枚硬币抛掷两次,其中事件 A 为 “至少一次为正面(H)” ,事件 B 为 “两次掷出同面” ,那么已知事件 A 发生的条件下事件 B 发生的概率。

这里的样本空间为 S={HH, HT, TH, TT} A={HH, HT, TH} B={HH, TT} 那么如果事件 A 已经发生,事件 B 发生的概率为 P(B|A)=[1/4]/[3/4]=1/3

需要注意的是,在这些定义中 A 与 B 之间不一定有因果或者时间序列关系,A 可能会先于 B 发生,也可能相反,也可能二者同时发生;A 可能会导致 B 的发生,也可能相反,也可能二者之间根本就没有因果关系。

贝叶斯公式

通过条件概率,就可以得到乘法公式,也就是 P(AB)=P(A|B)P(B)=P(B|A)P(A)

进而可以得出,贝叶斯最常用的公式,如下:

\[P(A|B) = \frac{P(B|A)P(A)}{P(B)}\]

这个看起来很简单,无非就是条件概率和联合概率公式的组合,其中:

  • P(A) 是先验概率或者边缘概率,之所以称为 “先验” 是因为不考虑任何与 B 相关的因素,完全独立计算,可以通过大数据统计得到。
  • P(A|B) 已知 B 发生后 A 发生的概率,称为 A 的后验概率。
  • P(B) 是先验概率或者边缘概率,也被称为标准化常量 (Normalized Constant)。

bayes

贝叶斯推断

为了方便计算后验概率,这里采用共轭先验的方法来简化后验的计算。

先验概率

这里仍然以投掷硬币为例,开始认为正面朝上的概率服从 Beta 分布,Beta 分布能产生一个 $(0, 1)$ 之间的随机数,也就是说先验概率为 Beta 分布。

\[f(x;\alpha,\beta)=\frac{1}{B(\alpha, \beta)} x^{\alpha - 1} (1 - x)^{\beta - 1}\]

开始假设 $\alpha=\beta=1$,那么此时 Beta 分布退化为一个均匀分布。接着不断投硬币,记录好每次投掷结果,然后根据结果再来计算此时正面朝上的概率。

似然函数

也就是在 $n$ 次试验中,有 $k$ 次朝上的概率,显然满足二项分布,可以表示为。

\[P(x|\theta)=C_n^k \theta^k (1 - \theta)^{n-k}\]

后验概率

这里直接通过计算求解。

\[\begin{align} P(\theta|x) &= \frac{P(x|\theta)P(\theta)}{P(x)} \propto P(x|\theta)P(\theta) \\ &= \left ( C_n^k \theta^k (1 - \theta)^{n-k} \right ) \left(\frac{1}{B(\alpha, \beta)} \theta^{\alpha - 1} (1 - \theta)^{\beta - 1}\right) \\ &=\frac{C_n^k}{B(\alpha,\beta)} \theta^{(k+\alpha)-1}\left(1-\theta\right)^{(n-k+\beta)-1} \\ &\propto \frac{1}{B\left(k+\alpha, n-k+\beta\right)} \theta^{(k+\alpha)-1} \left(1-\theta\right)^{(n-k+\beta)-1} \end{align}\]

可以看到,后验概率也是 Beta 分布,可以很方便的通过先验 Beta 分布来计算出后验概率。

试验

对应的试验如下,也就是,随着试验次数的增加,正面朝上的概率越来越接近 $0.5$ 。

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

# Arguments for prior Beta distribution
(alpha, beta) = (1, 1)

# Create a list of the number of coin tosses ("Bernoulli trials")
number_of_trials = [0, 2, 10, 20, 50, 500]

# Conduct 500 coin tosses and output into a list of 0s and 1s
# where 0 represents a tail and 1 represents a head
data = stats.bernoulli.rvs(0.5, size=number_of_trials[-1])

# Discretise the x-axis into 100 separate plotting points
x = np.linspace(0, 1, 100)

# Loops over the number_of_trials list to continually add
# more coin toss data. For each new set of data, we update
# our (current) prior belief to be a new posterior. This is
# carried out using what is known as the Beta-Binomial model.
# For the time being, we won't worry about this too much. It
# will be the subject of a later article!
for i, N in enumerate(number_of_trials):
	# Accumulate the total number of heads for this
	# particular Bayesian update
	heads = data[:N].sum()

	# Create an axes subplot for each update
	ax = plt.subplot(len(number_of_trials) / 2, 2, i + 1)
	ax.set_title("%s trials, %s heads" % (N, heads))

	# Add labels to both axes and hide labels on y-axis
	plt.xlabel("$P(H)$, Probability of Heads")
	plt.ylabel("Density")
	if i == 0:
		plt.ylim([0.0, 2.0])
	plt.setp(ax.get_yticklabels(), visible=False)

	# Create and plot a Beta distribution to represent the
	# posterior belief in fairness of the coin.
	y = stats.beta.pdf(x, alpha + heads, beta + N - heads)
	plt.plot(x, y, label="observe %d tosses,\n %d heads" % (N, heads))
	plt.fill_between(x, 0, y, color="#aaaadd", alpha=0.5)

# Expand plot to cover full width/height and show it
plt.tight_layout()
plt.show()

bayesian example

案例

很多时候示例是最显而易见的讲解方式。

案例 #1

一个学校里有 60% 男生和 40% 女生,女生穿裤子的人数和穿裙子的人数相等,所有男生穿裤子。一个人在远处随机看到了一个穿裤子的学生,那么这个学生是女生的概率是多少?

利用贝叶斯定理,假设事件 A 是看到女生,事件 B 是看到一个穿裤子的学生,那么我们所要计算的是 P(A|B)

  • P(A) 是忽略其它因素,看到女生的概率,在这里是 40%
  • P(A') 是忽略其它因素,看到不是女生(也就是看到男生)的概率,在这里是 60%
  • P(B|A) 是女生穿裤子的概率,在这里是 50%
  • P(B|A') 是男生穿裤子的概率,在这里是 100%
  • P(B) 是忽略其它因素,直接考虑学生穿裤子的概率,P(B) = P(B|A)P(A) + P(B|A')P(A'),在这里是 0.5*0.4 + 1*0.6 = 0.8

那么根据贝叶斯公式,可以计算得到,也就是 P(A|B) = (0.5 * 0.4)/(0.8) = 0.25

贝叶斯过滤器

对于垃圾邮件来说,传统使用较多的是关键词,但是很容易误判,2002 年 Paul Graham 提出使用 “贝叶斯推断” 过滤垃圾邮件,取得了很好的效果,据说 1000 封垃圾邮件可以过滤掉 995 封,且没有一个误判。

另外,这种过滤器还具有学习能力,会根据新收到的邮件,不断调整,收到的垃圾邮件越多,它的准确率就越高。



如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^