前言
目前正在学习统计学习方法,但是书籍里面的概念太过于抽象,索性去网上收集了各位网友给出的合理解释,同时在此记录,方便更多的同学一起来学习探讨!
这篇文章重点给大家介绍极大似然估计、贝叶斯估计以及极大后验概率估计之间的联系和区别。
一、SNACKS
那么在正式介绍这些概念之前,先简单给大家介绍几个前置知识点解解馋:
概率和统计,两者研究的问题相同吗?
概率(probabilty
)和统计(statistics
)看似两个相近的概念,其实研究的问题恰好相反。
概率研究的问题是,已知一个模型和参数,怎么去预测这个模型产生的结果的特性(例如均值,方差,协方差等等)。 举个例子,我想研究怎么养猪(模型是猪),我选好了想养的品种、喂养方式、猪棚的设计等等(选择参数),我想知道我养出来的猪大概能有多肥,肉质怎么样(预测结果)。
而统计研究的问题则是,有一堆数据,要利用这堆数据去预测模型和参数。仍以猪为例。现在我买到了一堆肉,通过观察和判断,我确定这是猪肉(这就确定了模型。在实际研究中,也是通过观察数据推测模型是/像高斯分布的、指数分布的、拉普拉斯分布的等等),然后,可以进一步研究,判定这猪的品种、这是圈养猪还是跑山猪还是网易猪,等等(推测模型参数)。
一句话总结:概率是已知模型和参数,推数据。统计是已知数据,推模型和参数。
显然,本文接下来要解释的极大似然估计Maximum Likelihood Estimation
、贝叶斯估计Bayesian Estimation
和极大后验概率估计Maximum Aposteriori Estimation
都是统计领域的问题。它们都是用来推测参数的方法。为什么会存在着两种不同方法呢? 这需要理解贝叶斯思想。我们来看看贝叶斯公式。
贝叶斯公式表达的是什么意思?
学习过概率论的同学应该对贝叶斯公式不陌生,它是概率论的奠基理论:
贝叶斯定理由英国数学家贝叶斯 ( Thomas Bayes 1702-1761 ) 发展,用来描述两个条件概率之间的关系,比如
P
(
A
∣
B
)
P(A|B)
P(A∣B) 和
P
(
B
∣
A
)
P(B|A)
P(B∣A)。按照联合概率乘法法则,可以立刻导出:
P
(
A
,
B
)
(
或
者
P
(
A
∩
B
)
)
=
P
(
A
)
∗
P
(
B
∣
A
)
=
P
(
B
)
∗
P
(
A
∣
B
)
P(A, B)(或者P(A∩B)) = P(A)*P(B|A)=P(B)*P(A|B)
P(A,B)(或者P(A∩B))=P(A)∗P(B∣A)=P(B)∗P(A∣B)
如上公式也可变形为:
P
(
A
∣
B
)
=
P
(
B
∣
A
)
∗
P
(
A
)
P
(
B
)
P(A|B)=\frac{P(B|A)*P(A)}{P(B)}
P(A∣B)=P(B)P(B∣A)∗P(A)------①
我们把分子
P
(
B
)
P(B)
P(B)展开即可得到:
P
(
A
∣
B
)
=
P
(
B
∣
A
)
∗
P
(
A
)
P
(
B
∣
A
)
∗
P
(
A
)
+
P
(
B
∣
∼
A
)
∗
P
(
∼
A
)
P(A|B)=\frac{P(B|A)*P(A)}{P(B|A)*P(A) + P(B|\sim A)*P(\sim A)}
P(A∣B)=P(B∣A)∗P(A)+P(B∣∼A)∗P(∼A)P(B∣A)∗P(A)------②
这个式子就比较有意思了。
想想这个情况。一辆汽车(或者电瓶车)的警报响了,你通常是什么反应?有小偷?撞车了? 不。。 你通常什么反应都没有。因为汽车警报响一响实在是太正常了!每天都要发生好多次。本来,汽车警报设置的功能是,出现了异常情况,需要人关注。然而,由于虚警实在是太多,人们渐渐不相信警报的功能了。
贝叶斯公式就是在描述,你有多大把握能相信一件证据。(how much you can trust the evidence)
我们假设响警报的目的就是汽车被砸了。把A事件
计作“汽车被砸了”,B事件
计作“警报响了”,加下来我们可以带进贝叶斯公式里看。我们想求等式左边发生
A
∣
B
A|B
A∣B 的概率,这是在说警报响了,汽车也确实被砸了。汽车被砸引起(trigger
)警报响,即
B
∣
A
B|A
B∣A 。但是,也有可能是汽车被小孩子的皮球踢了一下、被行人碰了一下等其他原因(统统计作
∼
A
∼A
∼A),其他原因引起汽车警报响了,即
B
∣
∼
A
B|∼A
B∣∼A 。那么,现在突然听见警报响了,这时汽车已经被砸了的概率是多少呢(这就是说,“警报响了”这个证据有了,有多大把握能相信它确实是在报警说汽车被砸了)?想一想,应当这样来计算:
用警报响起同时汽车也被砸了这事件的数量,除以响警报事件的总数量(这即【式①】)。进一步展开,即警报响起的同时汽车也被砸了的事件的数量,除以警报响起的同时汽车被砸了的事件数量加上警报响起的同时汽车没被砸的事件数量(这即【式②】)。
这个过程可能有点绕,请大家稍微琢磨琢磨。
再思考【式①】:
想让
P
(
A
∣
B
)
=
1
P(A|B)=1
P(A∣B)=1 ,即警报响了,汽车一定被砸了,该怎么做呢?让
P
(
B
∣
∼
A
)
P
(
∼
A
)
=
0
P(B|∼A)P(∼A)=0
P(B∣∼A)P(∼A)=0 即可。很容易想清楚,假若让
P
(
∼
A
)
=
0
P(∼A)=0
P(∼A)=0 ,即杜绝了汽车被球踢、被行人碰到等等其他所有情况,那自然,警报响了,只剩下一种可能——汽车被砸了。这即是提高了响警报这个证据的说服力。
从这个角度总结贝叶斯公式:做判断的时候,要考虑所有的因素。 老板骂你,不一定是你把什么工作搞砸了,可能只是他今天出门前和太太吵了一架。
再思考【式②】。观察【式②】右边的分子,
P
(
B
∣
A
)
P(B|A)
P(B∣A) 为汽车被砸后响警报的概率。姑且认为它是1吧。但是,若
P
(
A
)
P(A)
P(A) 很小,即汽车被砸的概率本身就很小,则
P
(
B
∣
A
)
P
(
A
)
P(B|A)P(A)
P(B∣A)P(A) 仍然很小,即【式②】右边分子仍然很小,
P
(
A
∣
B
)
P(A|B)
P(A∣B) 还是大不起来。 这里,
P
(
A
)
P(A)
P(A) 即是常说的先验概率,如果 A
的先验概率很小,就算
P
(
B
∣
A
)
P(B|A)
P(B∣A) 较大,可能 A
的后验概率
P
(
A
∣
B
)
P(A|B)
P(A∣B) 还是不会变大(假设
P
(
B
∣
∼
A
)
P
(
∼
A
)
P(B|∼A)P(∼A)
P(B∣∼A)P(∼A) 不变的情况下)。
从这个角度思考贝叶斯公式:一个本来就难以发生的事情,就算出现某个证据和他强烈相关,也要谨慎。证据很可能来自别的虽然不是很相关的但发生概率较高的事情。 发现刚才写的代码编译报错,可是我今天状态特别好,这语言我也很熟悉,犯错的概率很低。因此觉得是编译器出错了。 ————别,还是先再检查下自己的代码吧。
好了好了,说了这么多,下面言归正传,先介绍似然函数。
似然函数(Likelihood Function)
似然(likelihood
)这个词其实和概率(probability
)是差不多的意思, Colins
字典这么解释:The likelihood of something happening is how likely it is to happen.
你把 likelihood
换成 probability
,这解释也读得通。但是在统计里面,似然函数和概率函数却是两个不同的概念(其实也很相近就是了)。
对于
P
(
x
∣
θ
)
P(x|θ)
P(x∣θ) 这个表达式来说:
输入有两个:x
表示某一个具体的数据;θ
表示模型的参数。
如果 θ
是已知确定的,x
是变量,这个函数就叫做概率函数(probability function
),它描述对于不同的样本点 x
,其出现的概率是多少。
如果 x
是已知确定的,θ
是变量,这个函数就叫做似然函数(likelihood function
), 它描述对于不同的模型参数,出现 x
这个样本点的概率是多少。
这有点像“一菜两吃”的意思。其实这样的形式我们以前也不是没遇到过。例如,
f
(
x
,
y
)
=
x
y
f(x,y)=x^y
f(x,y)=xy , 即
x
x
x 的
y
y
y 次方。如果
x
x
x 是已知确定的(例如 x=2
),那么就是
f
(
y
)
=
2
y
f(y)=2^y
f(y)=2y , 这是指数函数。 如果
y
y
y 是已知确定的(例如 y=2
),那么就是
f
(
x
)
=
x
2
f(x)=x^2
f(x)=x2 ,这是二次函数。同一个数学形式,从不同的变量角度观察,可以有不同的名字。
这么说应该清楚了吧? 如果还没讲清楚,别急,下文会有具体例子。
二、极大似然估计(MLE)
假设有一个造币厂生产某种硬币,现在我们拿到了一枚这种硬币,想试试这硬币是不是均匀的。即想知道抛这枚硬币,正反面出现的概率(记为 P ( f a c e _ u p ) = θ P(face\_up) = θ P(face_up)=θ )各是多少?
这是一个统计问题,回想一下,解决统计问题需要什么? 数据!
于是我们拿这枚硬币抛了 10
次,得到的数据(
x
0
x_0
x0 )是:10次试验中出现7次正面朝上
。我们想求的正面概率
θ
θ
θ 是模型参数,而抛硬币模型我们可以假设是 二项分布
。
那么,出现实验结果
x
0
x_0
x0(即10次试验中出现7次正面朝上
)的似然函数是多少呢?
很明显这是一个二项分布:
f
(
x
0
,
θ
)
(
也
可
记
作
f
(
x
0
∣
θ
)
)
=
(
10
7
)
∗
θ
7
∗
(
1
−
θ
)
3
f(x_0,θ)(也可记作f(x_0|θ)) = {10 \choose 7}*θ^7*(1−θ)^3
f(x0,θ)(也可记作f(x0∣θ))=(710)∗θ7∗(1−θ)3
注意,这是个只关于
θ
θ
θ 的函数。而最大似然估计,顾名思义,就是要最大化这个函数。我们可以画出
f
(
θ
)
f(θ)
f(θ) 的图像:
附上图绘制的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.special import comb
x = np.linspace(0, 1, 1000)
y = comb(10, 7) * x**7 * (1 - x)**3
plt.figure(figsize=(20, 8), dpi=80)
plt.xlabel('theta', fontsize=24)
plt.ylabel('likelyhood function value', fontsize=24)
plt.plot(x, y)
plt.show()
可以看出,在 θ = 0.7 θ=0.7 θ=0.7 时,似然函数取得最大值。
这样,我们已经完成了对 θ θ θ 的最大似然估计。即,抛10次硬币,发现7次硬币正面向上,最大似然估计认为正面向上的概率是0.7。(ummm…这非常直观合理,对吧?)
且慢,一些人可能会说,硬币一般都是均匀的啊! 就算你做实验发现结果是“10次试验中出现7次正面朝上”,我也不信 θ = 0.7 θ=0.7 θ=0.7 。
这里就包含了贝叶斯学派的思想了——要考虑先验概率。 为此,引入了最大后验概率估计。
三、极大后验概率估计(MAP)
最大似然估计是求参数
θ
θ
θ , 使似然函数
P
(
x
0
∣
θ
)
P(x_0|θ)
P(x0∣θ) 最大。最大后验概率估计则是想求
θ
θ
θ 使
P
(
x
0
∣
θ
)
P
(
θ
)
P(x_0|θ)P(θ)
P(x0∣θ)P(θ) 最大。求得的
θ
θ
θ 不单单让似然函数大,
θ
θ
θ 自己出现的先验概率
P
(
θ
)
P(θ)
P(θ) 也得大。 (这有点像正则化里加惩罚项的思想,不过正则化里是利用加法,而 MAP
里是利用乘法)。
其实 MAP
是在最大化
P
(
θ
∣
x
0
)
=
P
(
x
0
∣
θ
)
∗
P
(
θ
)
P
(
x
0
)
P(θ|x_0) = \frac{P(x_0|θ)*P(θ)}{P(x_0)}
P(θ∣x0)=P(x0)P(x0∣θ)∗P(θ) ,不过因为
x
0
x_0
x0 是确定的(即投出的是10次试验中出现7次正面朝上
),
P
(
x
0
)
P(x_0)
P(x0) 是一个已知值,所以去掉了分母
P
(
x
0
)
P(x_0)
P(x0)(假设“投 10
次硬币”是一次实验,实验做了 1000
次,10次试验中出现7次正面朝上
出现了 n
次,则
P
(
x
0
)
=
n
/
1000
P(x_0)=n/1000
P(x0)=n/1000 。总之,这是一个可以由数据集得到的值)。最大化
P
(
θ
∣
x
0
)
P(θ|x_0)
P(θ∣x0) 的意义也很明确,
x
0
x_0
x0 已经出现了,要求
θ
θ
θ 取什么值使得
P
(
θ
∣
x
0
)
P(θ|x_0)
P(θ∣x0) 最大。顺带一提,
P
(
θ
∣
x
0
)
P(θ|x_0)
P(θ∣x0) 即后验概率,这就是 最大后验概率估计
名字的由来。
对于投硬币的例子来看,我们认为(”先验地知道“)
θ
θ
θ 取 0.5
的概率很大,取其他值的概率小一些。我们用一个高斯分布来具体描述我们掌握的这个先验知识,例如假设
P
(
θ
)
P(θ)
P(θ) 为均值 0.5
,方差 0.1
的高斯函数,它的概率密度函数为:
P
(
θ
)
=
1
0.1
2
π
e
x
p
−
1
2
(
θ
−
0.5
0.1
)
2
P(θ) = \frac{1}{0.1 \sqrt{2\pi}}exp^{-\frac{1}{2}(\frac{θ - 0.5}{0.1})^2}
P(θ)=0.12π1exp−21(0.1θ−0.5)2
如下图:
附上图绘制的代码:
sigma = 0.1
mu = 0.5
x = np.linspace(0, 1, 1000)
y = 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x - mu)**2 / (2 * sigma**2) )
plt.figure(figsize=(20, 8), dpi=80)
plt.xlabel('theta', fontsize=24)
plt.ylabel('likelyhood function value', fontsize=24)
plt.plot(x, y)
plt.show()
则
P
(
x
0
∣
θ
)
P
(
θ
)
P(x_0|θ)P(θ)
P(x0∣θ)P(θ) 的表达式为:
P
(
x
0
∣
θ
)
P
(
θ
)
=
(
10
7
)
∗
θ
7
∗
(
1
−
θ
)
3
∗
1
0.1
2
π
e
x
p
−
1
2
(
θ
−
0.5
0.1
)
2
P(x_0|θ)P(θ) = {10 \choose 7}*θ^7*(1−θ)^3*\frac{1}{0.1 \sqrt{2\pi}}exp^{-\frac{1}{2}(\frac{θ - 0.5}{0.1})^2}
P(x0∣θ)P(θ)=(710)∗θ7∗(1−θ)3∗0.12π1exp−21(0.1θ−0.5)2
函数图像为:
附上图绘制的代码:
sigma = 0.1
mu = 0.5
x = np.linspace(0, 1, 1000)
y = comb(10, 7) * x**7 * (1 - x)**3 * 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x - mu)**2 / (2 * sigma**2) )
plt.figure(figsize=(20, 8), dpi=80)
plt.xlabel('theta', fontsize=24)
plt.ylabel('likelyhood function value', fontsize=24)
plt.plot(x, y)
plt.show()
注意,此时函数取最大值时,
θ
θ
θ 取值已向左偏移,不再是 0.7
。实际上,在
θ
=
0.558
θ=0.558
θ=0.558 时函数取得了最大值。即用最大后验概率估计,得到
θ
=
0.558
θ=0.558
θ=0.558
最后,那要怎样才能说服一个贝叶斯派相信
θ
=
0.7
θ=0.7
θ=0.7 呢?你得多做点实验。。
如果做了 1000
次实验,其中 700
次都是正面向上,(此时还是二项分布试验)这时似然函数为:
f
(
x
0
,
θ
)
(
也
可
记
作
f
(
x
0
∣
θ
)
)
=
(
1000
700
)
∗
θ
700
∗
(
1
−
θ
)
300
f(x_0,θ)(也可记作f(x_0|θ)) = {1000 \choose 700}*θ^{700}*(1−θ)^{300}
f(x0,θ)(也可记作f(x0∣θ))=(7001000)∗θ700∗(1−θ)300
函数图像为:
附上图的绘制代码:
x = np.linspace(0, 1, 1000)
y = comb(1000, 700) * x**700 * (1 - x)**300
plt.figure(figsize=(20, 8), dpi=80)
plt.xlabel('theta', fontsize=24)
plt.ylabel('likelyhood function value', fontsize=24)
plt.plot(x, y)
plt.show()
如果仍然假设
P
(
θ
)
P(θ)
P(θ) 为均值 0.5
,方差 0.1
的高斯函数,
P
(
x
0
∣
θ
)
P
(
θ
)
P(x_0|θ)P(θ)
P(x0∣θ)P(θ) 的表达式为:
P
(
x
0
∣
θ
)
P
(
θ
)
=
(
1000
700
)
∗
θ
700
∗
(
1
−
θ
)
300
∗
1
0.1
2
π
e
x
p
−
1
2
(
θ
−
0.5
0.1
)
2
P(x_0|θ)P(θ) = {1000 \choose 700}*θ^{700}*(1−θ)^{300}*\frac{1}{0.1 \sqrt{2\pi}}exp^{-\frac{1}{2}(\frac{θ - 0.5}{0.1})^2}
P(x0∣θ)P(θ)=(7001000)∗θ700∗(1−θ)300∗0.12π1exp−21(0.1θ−0.5)2
函数图像为:
附上图绘制的代码:
sigma = 0.1
mu = 0.5
x = np.linspace(0, 1, 1000)
y = comb(1000, 700) * x**700 * (1 - x)**300 * 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x - mu)**2 / (2 * sigma**2) )
plt.figure(figsize=(20, 8), dpi=80)
plt.xlabel('theta', fontsize=24)
plt.ylabel('likelyhood function value', fontsize=24)
plt.plot(x, y)
plt.show()
在 θ = 0.696 θ=0.696 θ=0.696 处, P ( x 0 ∣ θ ) P ( θ ) P(x_0|θ)P(θ) P(x0∣θ)P(θ) 取得最大值。
这样,就算一个考虑了先验概率的贝叶斯派,也不得不承认得把
θ
θ
θ 估计在 0.7
附近了。
PS:要是遇上了顽固的贝叶斯派,认为
P
(
θ
=
0.5
)
=
1
P(θ=0.5)=1
P(θ=0.5)=1 ,那就没得玩了。。。无论怎么做实验,使用 MAP
估计出来都是
θ
=
0.5
θ=0.5
θ=0.5 。这也说明,一个合理的先验概率假设是很重要的。(通常,先验概率能从数据中直接分析得到)
四、贝叶斯估计
由贝叶斯公式可知,使用贝叶斯估计计算参数的值使得似然函数取得最大值,实际上还是使用到了极大后验概率估计的思想,而且由于参数
θ
θ
θ 是满足一定概率分布的变量,所以在样本量足够大时我们要考虑所有
θ
θ
θ 的取值情况,以致在计算的过程中不可避免的引入了高复杂度,所以在计算的时候并不把后验概率都计算出来,而是使用类似于极大似然估计 MLE
的思想,用极大后验概率估计 MAP
的方法去计算更加简单有效。
五、极大似然估计、贝叶斯估计和极大后验概率估计的区别
相信读完上文,MLE
和 MAP
的区别应该是很清楚的了。MAP
就是多个作为因子的先验概率
P
(
θ
)
P(θ)
P(θ) 。或者,也可以反过来,认为 MLE
是把先验概率
P
(
θ
)
P(θ)
P(θ) 认为等于 1
,即认为
θ
θ
θ 是均匀分布。
MLE
提供了一种给定观察数据来估计模型参数的方法,即“模型已定,参数未知”。即在频率学派中,参数固定了,预测值也就固定了。而 MAP
则是贝叶斯学派在完全贝叶斯不一定可行后采用的一种近似手段,如果数据量足够大,MLE
和 MAP
的参数估计趋向于一致,如果观察数据为 0
,MAP
仅由先验概率决定。
MLE
是想似然函数极大化,而考虑了 MAP
的贝叶斯估计 BE
其实是想让后验概率极大化,主要区别在于估计参数时,一个考虑了先验,而另外一个则没有考虑。
参考文献
① 李航 - 《统计学习方法》
② 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解---作者: nebulaf91