先验分布与后验分布
1.回顾贝叶斯定理
首先,我们先来复习一下贝叶斯定理:
在这个简简单单的式子当中,蕴含了我们要掌握的很多重要内容:
因此我们更需要聚焦的就是如下的这个正比关系:
实际上,有一个概念需要大家树立,那就是后验分布也是不断的处在动态更新过程当中的。一次试验得到的后验分布,对于后续进一步收集到的新的观测数据,他又可以看作是后续分析的一个先验。
2.贝叶斯推断与后验分布
在贝叶斯推断中,我们将待估计的量记为
第一个是视作随机变量
第二个是基于参数
一旦确立了
3.贝叶斯推断求解过程
这里我们总结一下上述的整个过程:
首先,贝叶斯推断的起点是未知随机变量
然后,我们需要确定观测数据
一旦我们观察到了
如果是连续型的随机变量,就把上面的概率质量函数替换成概率密度函数就可以了。
4.贝叶斯推断实际举例
感觉说来说去,还是比较理论,很多量该怎么确定可能还是不知道如何下手。那么我们通过一个抛掷硬币的例子来把贝叶斯推断的过程演练一遍:
假设我们有一个并不均匀的硬币,投掷出正面和反面的概率并不是相等的0.5,因此我们通过不断的进行硬币抛掷试验来估计正面的概率
那么我们首先为
4.1.
这个先验分布我们之前很少接触,除了未知参数
其实这个分式大家不用特别关心,他可以被理解为一个正则项,保证整个概率密度函数的积分为1即可。
那么我们为什么要选择
我们刚刚说过,
代码片段:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
import seaborn
seaborn.set()
params = [0.25, 1, 10]
x = np.linspace(0, 1, 100)
f, ax = plt.subplots(len(params), len(params), sharex=True, sharey=True)
for i in range(len(params)):
for j in range(len(params)):
a = params[i]
b = params[j]
y = beta(a, b).pdf(x)
ax[i, j].plot(x, y, color='red')
ax[i, j].set_title('$\\alpha$={},$\\beta={}$'.format(a, b))
ax[i, j].set_ylim(0, 10)
ax[0, 0].set_xticks([0, 0.2, 0.4, 0.6, 0.8, 1])
ax[0, 0].set_yticks([0, 2.5, 5, 7.5, 10])
ax[1, 0].set_ylabel('$p(\\theta)$')
ax[2, 1].set_xlabel('$\\theta$')
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
运行结果:

参数
其次一点是共轭性,他能够极大的简化后验分布的计算,这一点我们接下来继续展开。
4.2.关于观测数据的分布
接下来,我们选择观测数据的分布,在抛掷硬币的过程中,确定了某一次抛掷硬币正面向上的概率
这里我们就抛掷10次硬币,其中令正面向上的概率分别是0.35,0.5,0.8,来看看观测数据所服从的分布:
代码片段:
from scipy.stats import binom
import matplotlib.pyplot as plt
import numpy as np
import seaborn
seaborn.set()
n = 10
p_params = [0.35, 0.5, 0.8]
x = np.arange(0, n + 1)
f, ax = plt.subplots(len(p_params), 1)
for i in range(len(p_params)):
p = p_params[i]
y = binom(n=n, p=p).pmf(x)
ax[i].vlines(x, 0, y, colors='red', lw=10)
ax[i].set_ylim(0, 0.5)
ax[i].plot(0, 0, label='n={}\n$\\theta$={}'.format(n, p), alpha=0)
ax[i].legend()
ax[i].set_xlabel('y')
ax[i].set_xticks(x)
ax[1].set_ylabel('$p(y|\\theta)$')
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
运行结果:

4.3.后验的计算
我们接下来就来计算后验:
因此:
而针对选定的先验,参数
最终实际的后验
此时你可能会问,后面我们再该怎么处理?我们从后验分布的概率密度函数的正比表达式:
那么我们很容易就能根据先验分布和观测数据得到后验分布了。
5.模拟实验验证
首先我们写一段模拟抛硬币的程序,我们手上的这枚硬币,正面向上的实际概率为0.62,我们模拟随机抛掷1000次硬币的试验,并且记录抛掷过程中,抛掷次数为
代码片段:
import random
def bernoulli_trial(p):
u = random.uniform(0, 1)
if u <= p:
return 1
else:
return 0
def coin_experiments(n_array, p):
y = 0
n_max = max(n_array)
results = []
for n in range(1, n_max+1):
y = y + bernoulli_trial(p)
if n in n_array:
results.append((y, n))
return results
print(coin_experiments([5, 10, 20, 100, 500, 1000], 0.62))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果:
[(2, 5), (4, 10), (11, 20), (60, 100), (306, 500), (614, 1000)]
这个结果中,每一个元组表示的含义为(正面的次数,试验的次数),记录了完成1000次试验的过程中,抛掷到5次,10次,20次,100次,500次和1000次的时候,相应的正面向上的次数。
例如
请大家放心的是,这个试验生成的结果完全是按照伯努利试验随机生成的,你可以再重复运行5次该实验,一定会得到完全不同的5组试验结果:
代码片段:
for i in range(5):
print(coin_experiments([5, 10, 20, 100, 1000, 10000], 0.62))
2
运行结果:
[(3, 5), (7, 10), (13, 20), (55, 100), (306, 500), (622, 1000)]
[(4, 5), (6, 10), (12, 20), (68, 100), (319, 500), (632, 1000)]
[(2, 5), (6, 10), (12, 20), (57, 100), (319, 500), (645, 1000)]
[(4, 5), (7, 10), (14, 20), (64, 100), (309, 500), (626, 1000)]
[(4, 5), (8, 10), (15, 20), (56, 100), (309, 500), (607, 1000)]
2
3
4
5
最后,我们利用三组
代码片段:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
import seaborn
seaborn.set()
params = [0.25, 1, 10]
x = np.linspace(0, 1, 100)
plt.plot(x, beta(0.25, 0.25).pdf(x), color='b', label='$\\alpha=0.25,\\beta=0.25$')
plt.fill_between(x, 0, beta(0.25, 0.25).pdf(x), color='b', alpha=0.25)
plt.plot(x, beta(1, 1).pdf(x), color='g',label='$\\alpha=1,\\beta=1$')
plt.fill_between(x, 0, beta(1, 1).pdf(x), color='g', alpha=0.25)
plt.plot(x, beta(10, 10).pdf(x), color='r',label='$\\alpha=10,\\beta=10$')
plt.fill_between(x, 0, beta(10, 10).pdf(x), color='r', alpha=0.25)
plt.gca().axes.set_ylim(0,10)
plt.gca().axes.set_xlabel('$\\theta$')
plt.gca().axes.set_ylabel('$p(\\theta)$')
plt.legend()
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
运行结果:

我们选择:
代码片段:
from scipy.stats import beta
import matplotlib.pyplot as plt
import numpy as np
import seaborn
seaborn.set()
theta_real = 0.62
n_array = [5, 10, 20, 100, 500, 1000]
y_array = [2, 4, 11, 60, 306, 614]
beta_params = [(0.25, 0.25), (1, 1), (10, 10)]
x = np.linspace(0, 1, 100)
fig, ax = plt.subplots(2, 3, sharex=True, sharey=True)
for i in range(2):
for j in range(3):
n = n_array[3 * i + j]
y = y_array[3 * i + j]
for (a_prior, b_prior), c in zip(beta_params, ('b', 'r', 'g')):
a_post = a_prior + y
b_post = b_prior + n - y
p_theta_given_y = beta.pdf(x, a_post, b_post)
ax[i, j].plot(x, p_theta_given_y, c)
ax[i, j].fill_between(x, 0, p_theta_given_y, color=c, alpha=0.25)
ax[i, j].axvline(theta_real, ymax=0.5, color='k')
ax[i, j].set_xticks([0, 0.2, 0.4, 0.6, 0.8, 1])
ax[i, j].set_title('n={},y={}'.format(n, y))
ax[0, 0].set_ylabel('$p(\\theta|y)$')
ax[1, 0].set_ylabel('$p(\\theta|y)$')
ax[1, 1].set_xlabel('$\\theta$')
plt.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
运行结果:

6.实验结果分析
我们来分析一下试验结果,首先我们设置了三种典型的先验分布,均匀分布、
在整个实验的每一个阶段,通过先验分布与观测数据的综合,我们得到了每个阶段的后验结果,我们从图中可以看出,贝叶斯推断得到的是一个后验分布,而不像极大似然估计中得到的是一个具体值。他表示了在给定观测数据的情况下,推断得到的未知参数
一般而言我们都会选择后验分布概率密度函数曲线的峰值作为我们最终对于未知参数的估计值。这就是贝叶斯推断中的最大后验概率(
从这个结果图中,我们可以看出很多的结论:
首先,随着观测数据的不断增多,后验分布会越来越集中,分布越集中表示对于参数的确定性越高,这很显然,观测数据的增多意味着有更多的数据、更多的信息来更新和支撑我们对于参数的认识。
其次,当观测数据的量足够多的时候,不同的先验分布对应的后验分布都会收敛到一个相同的结果,数据越多,通过最大后验概率准则得到的估计值就会与参数的实际值(黑色竖线)越接近。
7.关于共轭先验的问题
那么这里有一个重要的点要强调,当然也是我们当初没有谈到的,先验选择
先验分布是
这种分布的共轭特性,极大的简化了我们求解后验分布的计算复杂性。但是,共轭分布的情形并不普遍,因此如果不是在共轭先验的条件下去解决贝叶斯推断问题,那么在计算后验分布的过程中将会遇到非常大的困难,后验分布绝大多数情况下就不再是一个标准分布,甚至没有解析解,在这种情况下想了解后验分布的形态将遇到巨大的挑战,基于他去做后续的统计分析将难上加难。
先验分布与后验分布
什么是贝叶斯统计?
贝叶斯统计的重要特点在于,我们在建模前需要给出模型参数
实际上,先验分布的存在正是贝叶斯学派相对于频率学派更贴近实际问题的一点。虽然理论上我们在利用现有数据之前,不存在任何数据支持我们对
继续上面的例子,反复投掷同一枚硬币,我们通过常识可以知道其正面朝上的概率
这是我随意举例的一个先验分布。理论上,我们可以使用任何的分布作为先验分布。但一个好的先验分布需要囊括我们对参数的经验判断信息,而上文构造的分布则成功包含了关于
- 它当
时概率密度最大,符合上文所描述的对硬币的认知。 - 概率密度函数从
处向两端递减,这同样具有现实意义。我们几乎不可能找到正面朝上概率为 的硬币,甚至无法想象。
在得到了模型参数的先验分布之后,我们便可以通过样本数据
可以看到,通过贝叶斯公式,我们将
事实上,我们可以发现式子中的
我们只要对
下面是一个特殊的例子,能够帮助读者深化对于贝叶斯思想的印象:
Example
当我非常肯定,所有的硬币投掷正面朝上概率为0.5时,我可以设先验分布
我们可以得出,
小结
事实上,本文所举的考察二项分布的参数
附录
- 贝叶斯公式
我们回忆贝叶斯公式的形式:
注意上式描述的是