概率,先验概率,后验概率



今天看了 Larry Wasserman写的 All of Statistics中的第一章,第一章主要讲概率,其中最主要的就是贝叶斯公式。要了解贝叶斯公式,就得知道全概率公式:

通俗的讲,先验概率就是事情尚未发生前,我们对该事发生概率的估计,例如全概率公式中P(B)就是先验概率,求解方法有很多种,全概率公式是一种,也可以根据经验等,例如抛一枚硬币头向上的概率为0.5。

后验概率则是表示在事情已经发生的条件下,要求该事发生原因是有某个因素引起的可能性的大小。

先验概率是在缺乏某个事实的情况下描述一个变量;而后验概率(Probability of outcomes of an experiment after it has been performed and a certain event has occured.)是在考虑了一个事实之后的条件概率。

通过贝叶斯公式,利用先验概率、似然函数可以计算出后验概率。

贝叶斯公式有很多应用,可以应用到分类,也可以用来决策,基本思路都是找出使后验概率最大的那个结果。以分类为例,就是找出一个最大的概率:已知样本的某些特性,求解该样本属于某个类别的后验概率。举个垃圾邮件的例子:

将邮件分为三类,A1=spam,A2=low priority ,A3=high priority.从以前的经验中得到先验概率P(A1)=0.7,P(A2)=0.2,P(A3)=0.1.这三个的概率之和一定为1。设事件B为邮件中包含单词free(为啥是free,我也不知道,只是举个例子不要当真,也可以是democracy),我们可以古典概率模型计算出P(B|A1)=0.9,P(B|A2)=0.01,P(B|A3)=0.01.当然这三个的和可能不为1,你知道原因么?言归正传,某天我收到一封邮件,发件人来自米国这个头号资本主义国家,这不是重点,重点是这封邮件包含了单词free,问这封邮件为spam的概率是多少?


也就是说你有0.995的成功率判定该邮件为spam,至此你不知不觉地已经构建了最简单的反垃圾邮件算法,更多细节与拓展需要继续学习。

贝叶斯只是反垃圾邮件的一种方法,还可以用svm等方法,这个还没细看。

上述例子只是贝叶斯公式的一个简单应用,它还有更多的变形与应用,以后遇到在细写吧。

再举一个很经典的例子来深入了解下贝叶斯公式。这个例子基本是每个总结贝叶斯公式必用的例子,一方面是这个例子很经典,另一个原因就是人们都太懒了不愿意去想新的例子,不幸的是我也很懒。

如下:

有三个门,一个门后面有一个里有汽车,如果选对了就可以得到这辆车,当应试者选定一个门之后,主持人打开了另外一个门,空的。问应试者要不要换一个选择。假设主持人知道车所在的那个门。
经典解法(结论倒是正确的):
    第一次选择正确的概率是1/3,因此汽车在另外两个门里的概率是2/3。主持人指出一个门,如果你开始选错了(2/3概率),则剩下的那个门里100%有汽车;如果你第一次选对(1/3)了,剩下那个门里100%没汽车。
所以主持人提示之后,你不换的话正确概率是1/3*100%+2/3*0=1/3,你换的话正确概率是1/3*0+2/3*100%=2/3。这个解法的的问题在于,现在主持人已经打开一个空门了(而且主持人是有意打开这个门的),在这一“信息” 出现后,还能说当初选错的概率是2/3吗?这一后验事实不会改变我们对于先验概率的看法吗?答案是会的。更具体地说,主持人打开一扇门后,对当初选择错误 的概率估计不一定等于2/3。
    从头说起。假设我选了B门,假设主持人打开了C门,那么他在什么情况下会打开C门呢?
    若A有车(先验概率P=1/3),那主持人100%打开C门(他显然不会打开B);
    若B有车(先验概率P=1/3),那此时主持人有A和C两个选择,假设他以K的概率打开C(一般K=1/2,但我们暂把它设成变量);
    若C有车(先验概率P=1/3),那主持人打开C的概率为0(只要他不傻。。。)
    已知他打开了C,那根据贝叶斯公式——这里P(M|N)表示N事件发生时M事件发生的概率:

                            P(C打开|B有车)* p(B有车)

P(B有车|C打开)=     ------------------------------

                                 P(C打开)

                P(C打开|B有车)* p(B有车)

= ------------------------------------

   P(C打开|A有车)* p(A有车)+ P(C打开|B有车)* p(B有车)

                            K * 1/3

                =      -------------------

                         1 * 1/3 + K * 1/3

                          K

                =      -------

                        K + 1
    该值何时等于1/3 呢(也就是经典解法里的假设)? 只有 K=1/2 时。也就是一般情况下。但如果主持人有偏好,比方说他就是喜欢打开右边的门(假设C在右边),设K=3/4, 那么B有车的概率就变成了 3/5,不再是1/3,后验事实改变了先验概率的估计!

    但这并不改变正确的选择,我们仍然应该改选A门, 解释如下:

                             P(C打开|A有车)* p(A有车)

P(A有车|C打开)=   ------------------------------

                                 P(C打开)

             P(C打开|A有车)* p(A有车)

 = --------------------------------------------

    P(C打开|A有车)* p(A有车)+ P(C打开|B有车)* p(B有车)

                               1 * 1/3

                =       -------------------

                            1 * 1/3 + K * 1/3

                       1

                =   -------

                     K + 1

    而K < 1(假设主持人没有极端到非C不选的程度),所以永远有 P(B有车|C打开) < P( A有车|C打开).A有车的概率永远比B大,我们还是应该改变选择。
    这个解法的重点在于考虑了C被打开这个事实的影响,从而消除了关于先验后验的纷扰。

文中难免会出现错误,希望发现者提出宝贵意见与建议,共同进步,非常感谢。

All of statistics这本书还得继续看,希望能坚持下去。

补充

关于先验概率的求法:

先验概率可以利用蒙特卡洛的方法求之,有人写了篇比较详细的文章,我就不赘述了。转载如下:

最近,开始学习和概率模型相关的智能算法。这类算法能解决的问题很多,包括模式识别(分类问题)、预测、决策等等。是非常具有实际应用价值的一类算法。

当然,这类算法体系也非常的庞大,尤其是其中涉及高深的数学原理的方法众多。但是,显然,我们要讨论的问题算法并不属于此类(很大原因是因为我概率挂了)。我们今天讨论的重点将放在:如果一个概率我无法求得,那么我们有什么其他办法获得。

首先,我们来考虑著名的蒙特卡洛法”——又是是个名字很猛,其实很直白的算法。

考虑这样一个问题:投3个骰子,扔出8点的概率是多少?很简单是不是,但是其实算出来还是有一点点麻烦(记住,懒惰对于一个程序员 来时说一个优秀的品质,懒惰的人会详尽办法使问题变得容易处理)。那么,我们可不可以让计算机帮我们计算呢?计算机的最大特点是:计算快,但是不擅推 理。所以我们用一个和他很相配的办法来计算这个概率:试。具体来说就是,让计算机去投骰子,投100万次,看看其中有多少次是8点,然后我们就知道实际概 率了——这便是蒙特卡洛法,再简单不过的方法了,这个方法没有复杂的公式,没有麻烦的步骤,只是一个简单的思想:通过仿真来模拟现实,再用简单的统计方法得到概率。

现在大家对蒙特卡洛有了一个基本的认识,那么来详细讨论下在什么情况下,我们可以使用蒙特卡洛法——当然,在这之前,我们先要考虑一个更一般的问题:在什么情况下,我们可以使用一个(任何一种)基于概率论的方法?

对于刚刚的提出的骰子的问题,我们来考虑一个最最基本的问题:如果我只扔了1次骰子,那么我们可不可以认为结果就表示了实际概率呢?1000次呢?

对于第一个问题,所有人相信马上就会回答:不可以。但是1000次呢?有些人可能就犹豫了:应该可以了吧?那么,我们究竟应该扔多少次才可以得到我们想要的概率呢?

这里,请大家先沐浴更衣,因为我们要祭出一个有关概率论最最基础,也最有用的经验值:对于使用概率问题讨论的系统, 其必然存在的误差将约为(根号下样本数量)分之一。这个经验公式是薛定谔提出的,注意:这只是一个经验公式,没有任何的推理过程和证明,我们甚至不好意 思”在正式公式里面把它作为一项来讨论——他就好像是谚语一样的存在。但是,正是这样的一个谚语,决定了我们科学研究对象的一个重要分界线:我们只能 对系统中,个体数量足够的多的系统(比如瓶子里面的空气分子)使用统计学方法(统计力学)进行精确研究,而如果样本数量减少,比如近千个样本,那么根据公 式,我们得到的结果,将至少存在一个3%左右的误差——也就是说,如果计算得出一个事件的发生概率是3%,那么他可能是0%-6%中的任何一个值。显然, 在这种精度下,我们将只能对系统进行定性的分析或粗略的定量分析了。如果我们继续减少样本数量,比如,25个样本(对于像研究一个班级的每个学生、改革开 放后的每年的某项指标等等),那么,使用统计学就意味着我们引入了20%的误差(注意,这个误差只是定性的估计,并不意味着,你可以再论文里面写:由于这 个误差,所以实际概率是10%-50%),显然只有在你已经走投无路的时候(比如建模比赛明早交题)才能考虑使用统计学手段。

好,有了以上的基础,我们可以立刻就可以发现:对于使用蒙特卡洛法进行估计概率,只要我们可以对系统进行准确的仿真,那么,我们得到概率的精度将只和有限时间内,我们能进行的仿真次数有关了——大家可能已经注意到了,从上2篇开始,我们就在不断强调,我们的时间是有有限的,这是现在科学研究的一个重要限制:不是这个理论上可行就是可行的,他还要是可计算的。

所以,我们很容易提出了蒙特卡洛方法的一个基本限制:仿真速度必须足够的快,以使得我们可以在指定时间内,运行足够多次,以获得足够精度(根据刚刚的经验公式推断精度)。

现在,我们已经知道了蒙特卡洛法的基本限制了。那么,我们来考虑下另一个基本问题:我们在什么情况下,应该使用蒙特卡洛法呢?也就是说,这个方法可以解决什么问题呢?

从刚刚的例子中我们可以很容易总结出来,蒙特卡洛针对的问题是:如果我们需要知道一个概率,这个概率事件的产生方式我们已知(每个骰子以6分之一概率投到一个数字,然后相加),而用公式对概率进行求解非常麻烦(或者根本不可能,比如涉及解一个很多变量的高阶方程组等等)。更进一步的说,对于一个有基本编程能力的人来说,如果写一个仿真程序比你实际推导一个公式时间短,那么我们经应该使用蒙特卡洛法求解(比如刚刚骰子的例子,会用Matlab的朋友应该都是蒙特卡洛求解更快)。

所以,如果用一句话总结蒙特卡洛的用处,那么就是:复杂概率的简单求解办法。(就好像前面介绍的任何优化算法,都是复杂评价函数的快速求极值办法一样)

现在,请大家先对上面一句话留有印象,我们来开始介绍贝叶斯方法。

无论对于基于概率的模式识别,还是基于概率的决策问题,我们基本思路都是一样的,就是:找出概率最高的情况,作为的结果。对于模式识别问题,我们是找出他 最可能是的类型。而对于决策问题,我们则是找出最可能产生最好结果的方案。而找出概率的依据,就是我们现在的已知信息。(为了叙述方便,一下都以模式识别 问题说明,如果有与决策问题明显不同的地方,我会单独说明)

比如,对于一个识别问题,我们需要找出的就是最大的概率p ( 是某一物体 | 观测到物品具有特性X ) ,这种方法被称为最大后验假设。这个概率的描述非常直白,不用我过多解释,我们需要考虑的问题是,我们如何得到这一概率。显然,如果这个可以直接求得 的话,任何识别问题就都解决了。既然不好直接得到,那么有没有办法来用其他概率表示这一概率呢?当然有,这就是我们大家都知道的 贝叶斯公式。

P( h|D ) = P( D|h )*P(h)/P(D)

贝叶斯公式提供了利用先验概率P(h)和似然度P(D|h)来推导后验概率P(h|D)的方法(下面将看到,P(D)并不重要)。利用贝叶斯公式,我们可以将最大后验假设(缩写为MAP)重写为

MAP = max(P(h|D)) = max(P(D|h)*P(h)/P(D))

由于我们是求最大值,所以,我们可以将式中与h无关的P(D)项(对于所有的h,P(D)均为一常数)去掉,得到了标准的最大后验假设公式

MAP = max( P(D|h) * P(h) )

特殊的,对于很多情况下,我们没有理由说明任何一种情况的先验概率更大(比如数字识别系统,那么被识别对象h0-9的概率是相同的)。那么,P(h)也变成了一个常数,这时,我们将p(h)去掉,便得到了名为最大似然假设的方法(记为ML

ML = max( p(D|h) )

至此,对于原有问题,我们将问题转换为了求解MAP或者ML的问题。那么我们怎么求解呢?下面我们首先来讨论P(D|h)的问题。

P(D|h)的现实意义是:当我已知对象为h,观测到D的概率。写出这个概率的难度已经比我们写出P(h|D)的难度要低很多了,因为现在我们的问题已经 是:我知道这个是一个什么东西,那么它显出某一特性的概率有多少呢?显然,只要我们对我们要判断的东西有足够的认识,我们肯定能得到这个概率:最郁闷的情 况下,就用蒙特卡洛法仿真一下就是了!

另一方面,由于我们的MAP或是ML是求最大值的问题,我们又获得了一个更为有效地简化办法:只要我们设定的P'(D|h)满足与真实P(D|h)单调就 可以了(并且,所有P(D|h)相加可以不为1)。这一特性使得我们可以用非常多、且非常简便的方法近似求得MAP或者ML。比如,对于一个事件h,我们 知道应该有的标准观测值为d'。那么,我们完全可以简单的定义P(D|h)的值为(D-d')^2,即观测误差越大,则我观测到这个观测值的概率越低——这种做法在绝大多数情况下将非常简单而且效果出乎意料的好。

以上就是贝叶斯方法的基本形式。希望能给大家一些共鸣。


原文地址  http://www.zhenv5.com/%e6%a6%82%e7%8e%87%ef%bc%8c%e5%85%88%e9%aa%8c%e6%a6%82%e7%8e%87%ef%bc%8c%e5%90%8e%e9%aa%8c%e6%a6%82%e7%8e%87/

你可能感兴趣的:(编程,c,优化,算法,matlab,statistics)