贝叶斯方法体会

最近,开始学习和概率模型相关的智能算法。这类算法能解决的问题很多,包括模式识别(分类问题)、预测、决策等等。是非常具有实际应用价值的一类算法。
当然,这类算法体系也非常的庞大,尤其是其中涉及高深的数学原理的方法众多。但是,显然,我们要讨论的问题算法并不属于此类(很大原因是因为我概率挂了)。我们今天讨论的重点将放在:如果一个概率我无法求得,那么我们有什么其他办法获得。
首先,我们来考虑著名的“蒙特卡洛法”——又是是个名字很猛,其实很“直白”的算法。
考虑这样一个问题:投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) )
特殊的,对于很多情况下,我们没有理由说明任何一种情况的先验概率更大(比如数字识别系统,那么被识别对象h是0-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.ilovematlab.cn/thread-34806-1-1.html

猜你喜欢

转载自blog.csdn.net/qq_30142403/article/details/80365985
今日推荐