贝叶斯分类算法.docx_第1页
贝叶斯分类算法.docx_第2页
贝叶斯分类算法.docx_第3页
贝叶斯分类算法.docx_第4页
贝叶斯分类算法.docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近在面试中,除了基础 & 算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法,而我向来恨对一个东西只知其皮毛而不得深入,故写一个有关聚类 & 分类算法的系列文章以作为自己备试之用(尽管貌似已无多大必要,但还是觉得应该写下以备将来常常回顾思考)。行文杂乱,但侥幸若能对读者也起到一定帮助,则幸甚至哉。 本分类 & 聚类算法系列借鉴和参考了两本书,一本是Tom M.Mitchhell所著的机器学习,一本是数据挖掘导论,这两本书皆分别是机器学习 & 数据挖掘领域的开山or杠鼎之作,读者有继续深入下去的兴趣的话,不妨在阅读本文之后,课后细细研读这两本书。除此之外,还参考了网上不少牛人的作品(文末已注明参考文献或链接),在此,皆一一表示感谢。 本分类 & 聚类算法系列暂称之为Top 10 Algorithms in Data Mining,其中,各篇分别有以下具体内容:1. 开篇:决策树学习Decision Tree,与贝叶斯分类算法(含隐马可夫模型HMM);2. 第二篇:支持向量机SVM(support vector machine),与神经网络ANN;3. 第三篇:待定. 说白了,一年多以前,我在本blog内写过一篇文章,叫做:数据挖掘领域十大经典算法初探(题外话:最初有个出版社的朋友便是因此文找到的我,尽管现在看来,我离出书日期仍是遥遥无期)。现在,我抽取其中几个最值得一写的几个算法每一个都写一遍,以期对其有个大致通透的了解。 OK,全系列任何一篇文章若有任何错误,漏洞,或不妥之处,还请读者们一定要随时不吝赐教 & 指正,谢谢各位。基础储备:分类与聚类 在讲具体的分类和聚类算法之前,有必要讲一下什么是分类,什么是聚类,都包含哪些具体算法或问题。 常见的分类与聚类算法 简单来说,自然语言处理中,我们经常提到的文本分类便就是一个分类问题,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:朴素的贝叶斯分类算法(native Bayesian classifier)、基于支持向量机(SVM)的分类器,k-最近邻法(k-nearest neighbor,kNN),神经网络法,决策树分类法,模糊分类法等等(本篇稍后会讲决策树分类与贝叶斯分类算法,当然,所有这些分类算法日后在本blog内都会一一陆续阐述)。 而K均值聚类则是最典型的聚类算法。 监督学习与无监督学习 一般来说,机器学习方法分为监督学习方法,和无监督学习方法。举个具体的对应例子,则是比如说,在词义消岐中,也分为监督的消岐方法,和无监督的消岐方法。在有监督的消岐方法中,训练数据是已知的,即没歌词的语义分类是被标注了的;而在无监督的消岐方法中,训练数据是未经标注的。 有监督的学习也通常称为分类任务,而无监督的学习通常称为聚类任务。也就是说,分类属于监督学习,聚类属于无监督学习。第一部分、决策树学习1.1、什么是决策树 咱们直接切入正题。所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。 机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 从数据产生决策树的机器学习技术叫做决策树学习, 通俗点说就是决策树。 来理论的太过抽象,下面举两个浅显易懂的例子:第一个例子 套用俗语,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话: 女儿:多大年纪了? 母亲:26。 女儿:长的帅不帅? 母亲:挺帅的。 女儿:收入高不? 母亲:不算很高,中等情况。 女儿:是公务员不? 母亲:是,在税务局上班呢。 女儿:那好,我去见见。 这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑: 也就是说,决策树的简单策略就是,好比公司招聘面试过程中筛选一个人的简历,如果你的条件相当好比如说某985/211重点大学博士毕业,那么二话不说,直接叫过来面试,如果非重点大学毕业,但实际项目经验丰富,那么也要考虑叫过来面试一下,即所谓具体情况具体分析、决策。第二个例子 此例子来自Tom M.Mitchell著的机器学习一书: 小王的目的是通过下周天气预报寻找什么时候人们会打高尔夫,他了解到人们决定是否打球的原因最主要取决于天气情况。而天气状况有晴,云和雨;气温用华氏温度表示;相对湿度用百分比;还有有无风。如此,我们便可以构造一棵决策树,如下(根据天气这个分类决策这天是否合适打网球): 上述决策树对应于以下表达式:(Outlook=Sunny Humidity=70)V (Outlook = Overcast)V (Outlook=Rain Wind=Weak)1.2、ID3算法1.2.1、决策树学习之ID3算法 ID3算法是决策树算法的一种。想了解什么是ID3算法之前,我们得先明白一个概念:奥卡姆剃刀。 奥卡姆剃刀(Occams Razor, Ockhams Razor),又称“奥坎的剃刀”,是由14世纪逻辑学家、圣方济各会修士奥卡姆的威廉(William of Occam,约1285年至1349年)提出,他在箴言书注2卷15题说“切勿浪费较多东西,去做用较少的东西,同样可以做好的事情。简单点说,便是:be simple。 ID3算法(IterativeDichotomiser3迭代二叉树3代)是一个由RossQuinlan发明的用于决策树的算法。这个算法便是建立在上述所介绍的奥卡姆剃刀的基础上:越是小型的决策树越优于大的决策树(be simple简单理论)。尽管如此,该算法也不是总是生成最小的树形结构,而是一个启发式算法。 OK,从信息论知识中我们知道,期望信息越小,信息增益越大,从而纯度越高。ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益(很快,由下文你就会知道信息增益又是怎么一回事)最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策树空间。 所以,ID3的思想便是:1. 自顶向下的贪婪搜索遍历可能的决策树空间构造决策树(此方法是ID3算法和C4.5算法的基础);2. 从“哪一个属性将在树的根节点被测试”开始;3. 使用统计测试来确定每一个实例属性单独分类训练样例的能力,分类能力最好的属性作为树的根结点测试。4. 然后为根结点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支(也就是说,样例的该属性值对应的分支)之下。5. 重复这个过程,用每个分支结点关联的训练样例来选取在该点被测试的最佳属性。这形成了对合格决策树的贪婪搜索,也就是算法从不回溯重新考虑以前的选择。 下图所示即是用于学习布尔函数的ID3算法概要:1.2.2、哪个属性是最佳的分类属性1、信息增益的度量标准:熵 上文中,我们提到:“ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益(很快,由下文你就会知道信息增益又是怎么一回事)最大的属性进行分裂。”接下来,咱们就来看看这个信息增益是个什么概念(当然,在了解信息增益之前,你必须先理解:信息增益的度量标准:熵)。 上述的ID3算法的核心问题是选取在树的每个结点要测试的属性。我们希望选择的是最有利于分类实例的属性,信息增益(Information Gain)是用来衡量给定的属性区分训练样例的能力,而ID3算法在增长树的每一步使用信息增益从候选属性中选择属性。 为了精确地定义信息增益,我们先定义信息论中广泛使用的一个度量标准,称为熵(entropy),它刻画了任意样例集的纯度(purity)。给定包含关于某个目标概念的正反样例的样例集S,那么S相对这个布尔型分类的熵为: 上述公式中,p+代表正样例,比如在本文开头第二个例子中p+则意味着去打羽毛球,而p-则代表反样例,不去打球(在有关熵的所有计算中我们定义0log0为0)。 如果写代码实现熵的计算,则如下所示:1. /根据具体属性和值来计算熵2. doubleComputeEntropy(vectorvectorremain_state,stringattribute,stringvalue,boolifparent)3. vectorcount(2,0);4. unsignedinti,j;5. booldone_flag=false;/哨兵值6. for(j=1;jMAXLEN;j+)7. if(done_flag)break;8. if(!attribute_pare(attribute)9. for(i=1;iwind增益的0.048。说白了,就是在星期六上午是否适合打网球的问题诀策中,采取humidity较wind作为分类属性更佳,决策树由此而来。1. /计算信息增益,DFS构建决策树2. /current_node为当前的节点3. /remain_state为剩余待分类的样例4. /remian_attribute为剩余还没有考虑的属性5. /返回根结点指针6. Node*BulidDecisionTreeDFS(Node*p,vectorvectorremain_state,vectorremain_attribute)7. /if(remain_state.size()0)8. /printv(remain_state);9. /10. if(p=NULL)11. p=newNode();12. /先看搜索到树叶的情况13. if(AllTheSameLabel(remain_state,yes)14. p-attribute=yes;15. returnp;16. 17. if(AllTheSameLabel(remain_state,no)18. p-attribute=no;19. returnp;20. 21. if(remain_attribute.size()=0)/所有的属性均已经考虑完了,还没有分尽22. stringlabel=MostCommonLabel(remain_state);23. p-attribute=label;24. returnp;25. 26. 27. doublemax_gain=0,temp_gain;28. vector:iteratormax_it;29. vector:iteratorit1;30. for(it1=remain_attribute.begin();it1max_gain)33. max_gain=temp_gain;34. max_it=it1;35. 36. 37. /下面根据max_it指向的属性来划分当前样例,更新样例集和属性集38. vectornew_attribute;39. vectorvectornew_state;40. for(vector:iteratorit2=remain_attribute.begin();it2attribute=*max_it;45. vectorvalues=map_attribute_values*max_it;46. intattribue_num=FindAttriNumByName(*max_it);47. new_state.push_back(attribute_row);48. for(vector:iteratorit3=values.begin();it3values.end();it3+)49. for(unsignedinti=1;iarrived_value=*it3;56. if(new_state.size()=0)/表示当前没有这个分支的样例,当前的new_node为叶子节点57. new_node-attribute=MostCommonLabel(remain_state);58. 59. else60. BulidDecisionTreeDFS(new_node,new_state,new_attribute);61. /递归函数返回时即回溯时需要1将新结点加入父节点孩子容器2清除new_state容器62. p-childs.push_back(new_node);63. new_state.erase(new_state.begin()+1,new_state.end();/注意先清空new_state中的前一个取值的样例,准备遍历下一个取值样例64. 65. returnp;66. 1.2.3、ID3算法决策树的形成 OK,下图为ID3算法第一步后形成的部分决策树。这样综合起来看,就容易理解多了。1、overcast样例必为正,所以为叶子结点,总为yes;2、ID3无回溯,局部最优,而非全局最优,还有另一种树后修剪决策树。下图是ID3算法第一步后形成的部分决策树: 如上图,训练样例被排列到对应的分支结点。分支Overcast的所有样例都是正例,所以成为目标分类为Yes的叶结点。另两个结点将被进一步展开,方法是按照新的样例子集选取信息增益最高的属性。1.3、C4.5算法1.3.1、ID3算法的改进:C4.5算法 C4.5,是机器学习算法中的另一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,也是上文1.2节所介绍的ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它。 决策树构造方法其实就是每次选择一个好的特征以及分裂点作为当前节点的分类条件。 既然说C4.5算法是ID3的改进算法,那么C4.5相比于ID3改进的地方有哪些呢?:1. 用信息增益率来选择属性。ID3选择属性用的是子树的信息增益,这里可以用很多方法来定义信息,ID3使用的是熵(entropy,熵是一种不纯度度量准则),也就是熵的变化值,而C4.5用的是信息增益率。对,区别就在于一个是信息增益,一个是信息增益率。2. 在树构造过程中进行剪枝,在构造决策树的时候,那些挂着几个元素的节点,不考虑最好,不然容易导致overfitting。3. 对非离散数据也能处理。4. 能够对不完整数据进行处理 针对上述第一点,解释下:一般来说率就是用来取平衡用的,就像方差起的作用差不多,比如有两个跑步的人,一个起点是10m/s的人、其10s后为20m/s;另一个人起速是1m/s、其1s后为2m/s。如果紧紧算差值那么两个差距就很大了,如果使用速度增加率(加速度,即都是为1m/s2)来衡量,2个人就是一样的加速度。因此,C4.5克服了ID3用信息增益选择属性时偏向选择取值多的属性的不足。C4.5算法之信息增益率 OK,既然上文中提到C4.5用的是信息增益率,那增益率的具体是如何定义的呢?: 是的,在这里,C4.5算法不再是通过信息增益来选择决策属性。一个可以选择的度量标准是增益比率gainratio(Quinlan1986)。增益比率度量是用前面的增益度量Gain(S,A)和分裂信息度量SplitInformation(S,A)来共同定义的,如下所示: 其中,分裂信息度量被定义为(分裂信息用来衡量属性分裂数据的广度和均匀): 其中S1到Sc是c个值的属性A分割S而形成的c个样例子集。注意分裂信息实际上就是S关于属性A的各值的熵。这与我们前面对熵的使用不同,在那里我们只考虑S关于学习到的树要预测的目标属性的值的熵。 请注意,分裂信息项阻碍选择值为均匀分布的属性。例如,考虑一个含有n个样例的集合被属性A彻底分割(译注:分成n组,即一个样例一组)。这时分裂信息的值为log2n。相反,一个布尔属性B分割同样的n个实例,如果恰好平分两半,那么分裂信息是1。如果属性A和B产生同样的信息增益,那么根据增益比率度量,明显B会得分更高。 使用增益比率代替增益来选择属性产生的一个实际问题是,当某个Si接近S(|Si|S|)时分母可能为0或非常小。如果某个属性对于S的所有样例有几乎同样的值,这时要么导致增益比率未定义,要么是增益比率非常大。为了避免选择这种属性,我们可以采用这样一些启发式规则,比如先计算每个属性的增益,然后仅对那些增益高过平均值的属性应用增益比率测试(Quinlan1986)。 除了信息增益,LopezdeMantaras(1991)介绍了另一种直接针对上述问题而设计的度量,它是基于距离的(distance-based)。这个度量标准基于所定义的一个数据划分间的距离尺度。具体更多请参看:Tom M.Mitchhell所著的机器学习之3.7.3节。1.3.2、C4.5算法构造决策树的过程1. FunctionC4.5(R:包含连续属性的无类别属性集合,C:类别属性,S:训练集)2. /*返回一棵决策树*/3. Begin4. IfS为空,返回一个值为Failure的单个节点;5. IfS是由相同类别属性值的记录组成,6. 返回一个带有该值的单个节点;7. IfR为空,则返回一个单节点,其值为在S的记录中找出的频率最高的类别属性值;8. 注意未出现错误则意味着是不适合分类的记录;9. For所有的属性R(Ri)Do10. If属性Ri为连续属性,则11. Begin12. 将Ri的最小值赋给A1:13. 将Rm的最大值赋给Am;/*m值手工设置*/14. ForjFrom2Tom-1DoAj=A1+j*(A1Am)/m;15. 将Ri点的基于Aj的最大信息增益属性(Ri,S)赋给A;16. End;17. 将R中属性之间具有最大信息增益的属性(D,S)赋给D;18. 将属性D的值赋给dj/j=1,2.m;19. 将分别由对应于D的值为dj的记录组成的S的子集赋给sj/j=1,2.m;20. 返回一棵树,其根标记为D;树枝标记为d1,d2.dm;21. 再分别构造以下树:22. C4.5(R-D,C,S1),C4.5(R-D,C,S2).C4.5(R-D,C,Sm);23. EndC、C4.5算法实现中的几个关键步骤 在上文中,我们已经知道了决策树学习C4.5算法中4个重要概念的表达,如下:. 接下来,咱们写下代码实现, 1、信息熵1. doubleC4_5:entropy(int*attrClassCount,intclassNum,intallNum)2. doubleiEntropy=0.0;3. for(inti=0;iclassNum;i+)4. doubletemp=(double)attrClassCounti)/allNum;5. if(temp!=0.0)6. iEntropy-=temp*(log(temp)/log(2.0);7. 8. returniEntropy;9. 2、信息增益率1. doubleC4_5:gainRatio(intclassNum,vectorattriCount,doublepEntropy)2. int*attriNum=newintattriCount.size();3. intallNum=0;4. 5. for(inti=0;i(int)attriCount.size();i+)6. attriNumi=0;7. for(intj=0;jclassNum;j+)8. attriNumi+=attriCountij;9. allNum+=attriCountij;10. 11. 12. doublegain=0.0;13. doublesplitInfo=0.0;14. for(inti=0;i(int)attriCount.size();i+)15. gain-=(double)attriNumi)/allNum*entropy(attriCounti,classNum,attriNumi);16. splitInfo-=(double)attriNumi)/allNum*(log(double)attriNumi)/allNum)/log(2.0);17. 18. gain+=pEntropy;19. deleteattriNum;20. return(gain/splitInfo);21. 3、选取最大增益属性作为分类条件1. intC4_5:chooseAttribute(vectorattrIndex,vector*sampleCount)2. intbestIndex=0;3. doublemaxGainRatio=0.0;4. intclassNum=(int)(decisionsattrIndex(int)attrIndex.size()-1).size();/numberofclass5. 6. /computertheclassentropy7. int*temp=newintclassNum;8. intallNum=0;9. for(inti=0;iclassNum;i+)10. tempi=sampleCount(int)attrIndex.size()-1ii;11. allNum+=tempi;12. 13. doublepEntropy=entropy(temp,classNum,allNum);14. deletetemp;15. 16. /computergainratioforeveryattribute17. for(inti=0;imaxGainRatio)20. bestIndex=i;21. maxGainRatio=gainR;22. 23. 24. returnbestIndex;25. 4、还有一系列建树,打印树的步骤,此处略过。1.4、决策树归纳的特点 略过.第二部分、贝叶斯分类 说实话,友人刘未鹏有一篇讲的贝叶斯的文章:数学之美番外篇:平凡而又神奇的贝叶斯方法,已经把贝叶斯讲的很清晰透彻了,我再讲也是如李白看到崔颢在黄鹤楼上所提的:登黄鹤楼昔人已乘黄鹤去,此地空余黄鹤楼;黄鹤一去不复返,白云千载空悠悠。 后便大为折服,已无什兴致再提了(偶现在就是这感觉),然文章还得继续写。So,本文第二部分之大部分基本整理自未鹏兄之手,若有任何不妥之处,还望读者和未鹏兄海涵,谢谢。2.1、什么是贝叶斯分类 贝叶斯定理:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。这里先解释什么是条件概率:表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:。 贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。 下面不加证明地直接给出贝叶斯定理(公式被网友指出有问题,待后续验证改正): 2.2贝叶斯公式如何而来 贝叶斯公式是怎么来的?下面是wikipedia 上的一个例子:一所学校里面有 60% 的男生,40% 的女生。男生总是穿长裤,女生则一半穿长裤一半穿裙子。有了这些信息之后我们可以容易地计算“随机选取一个学生,他(她)穿长裤的概率和穿裙子的概率是多大”,这个就是前面说的“正向概率”的计算。然而,假设你走在校园中,迎面走来一个穿长裤的学生(很不幸的是你高度近似,你只看得见他(她)穿的是否长裤,而无法确定他(她)的性别),你能够推断出他(她)是男生的概率是多大吗? 一些认知科学的研究表明(决策与判断以及Rationality for Mortals第12章:小孩也可以解决贝叶斯问题),我们对形式化的贝叶斯问题不擅长,但对于以频率形式呈现的等价问题却很擅长。在这里,我们不妨把问题重新叙述成:你在校园里面随机游走,遇到了 N 个穿长裤的人(仍然假设你无法直接观察到他们的性别),问这 N 个人里面有多少个女生多少个男生。 你说,这还不简单:算出学校里面有多少穿长裤的,然后在这些人里面再算出有多少女生,不就行了? 我们来算一算:假设学校里面人的总数是 U 个。60% 的男生都穿长裤,于是我们得到了 U * P(Boy) * P(Pants|Boy) 个穿长裤的(男生)(其中 P(Boy) 是男生的概率 = 60%,这里可以简单的理解为男生的比例;P(Pants|Boy) 是条件概率,即在 Boy 这个条件下穿长裤的概率是多大,这里是 100% ,因为所有男生都穿长裤)。40% 的女生里面又有一半(50%)是穿长裤的,于是我们又得到了 U * P(Girl) * P(Pants|Girl) 个穿长裤的(女生)。加起来一共是 U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl) 个穿长裤的,其中有 U * P(Girl) * P(Pants|Girl) 个女生。两者一比就是你要求的答案。 下面我们把这个答案形式化一下:我们要求的是 P(Girl|Pants) (穿长裤的人里面有多少女生),我们计算的结果是 U * P(Girl) * P(Pants|Girl) / U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl) 。容易发现这里校园内人的总数是无关的,可以消去。于是得到P(Girl|Pants) = P(Girl) * P(Pants|Girl) / P(Boy) * P(Pants|Boy) + P(Girl) * P(Pants|Girl) 注意,如果把上式收缩起来,分母其实就是 P(Pants) ,分子其实就是 P(Pants, Girl) 。而这个比例很自然地就读作:在穿长裤的人( P(Pants) )里面有多少(穿长裤)的女孩( P(Pants, Girl) )。 上式中的 Pants 和 Boy/Girl 可以指代一切东西,So,其一般形式就是:P(A|B) = P(A|B) * P(B) / P(A|B) * P(B) + P(A|B) * P(B) 收缩起来就是:P(A|B) = P(AB) / P(B) 其实这个就等于:P(A|B) * P(B) = P(AB) 更进一步阐述,P(A|B)便是在条件B的情况下,A出现的概率是多大。然看似这么平凡的贝叶斯公式,背后却隐含着非常深刻的原理。2.3、拼写纠正 经典著作人工智能:现代方法的作者之一 Peter Norvig 曾经写过一篇介绍如何写一个拼写检查/纠正器的文章,里面用到的就是贝叶斯方法,这里我们不打算复述他写的文章,而是简要地将其核心思想介绍一下。 首先,我们需要询问的是:“问题是什么?” 问题是我们看到用户输入了一个不在字典中的单词,我们需要去猜测:“这个家伙到底真正想输入的单词是什么呢?”用刚才我们形式化的语言来叙述就是,我们需要求:P(我们猜测他想输入的单词 | 他实际输入的单词) 这个概率。并找出那个使得这个概率最大的猜测单词。显然,我们的猜测未必是唯一的,就像前面举的那个自然语言的歧义性的例子一样;这里,比如用户输入: thew ,那么他到底是想输入 the ,还是想输入 thaw ?到底哪个猜测可能性更大呢?幸运的是我们可以用贝叶斯公式来直接出它们各自的概率,我们不妨将我们的多个猜测记为 h1 h2 . ( h 代表 hypothesis),它们都属于一个有限且离散的猜测空间 H (单词总共就那么多而已),将用户实际输入的单词记为 D ( D 代表 Data ,即观测数据),于是P(我们的猜测1 | 他实际输入的单词) 可以抽象地记为:P(h1 | D) 类似地,对于我们的猜测2,则是 P(h2 | D)。不妨统一记为:P(h | D)运用一次贝叶斯公式,我们得到:P(h | D) = P(h) * P(D | h) / P(D) 对于不同的具体猜测 h1 h2 h3 . ,P(D) 都是一样的,所以在比较 P(h1 | D) 和 P(h2 | D) 的时候我们可以忽略这个常数。即我们只需要知道:P(h | D) P(h) * P(D | h) (注:那个符号的意思是“正比例于”,不是无穷大,注意符号右端是有一个小缺口的。) 这个式子的抽象含义是:对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小(先验概率,Prior )”和“这个猜测生成我们观测到的数据的可能性大小”(似然,Likelihood )的乘积。具体到我们的那个 thew 例子上,含义就是,用户实际是想输入 the 的可能性大小取决于 the 本身在词汇表中被使用的可能性(频繁程度)大小(先验概率)和 想打 the 却打成 thew 的可能性大小(似然)的乘积。 剩下的事情就很简单了,对于我们猜测为可能的每个单词计算一下 P(h) * P(D | h) 这个值,然后取最大的,得到的就是最靠谱的猜测。更多细节请参看未鹏兄之原文。2.4、贝叶斯的应用2.4.1、中文分词 贝叶斯是机器学习的核心方法之一。比如中文分词领域就用到了贝叶斯。浪潮之巅的作者吴军在数学之美系列中就有一篇是介绍中文分词的。这里介绍一下核心的思想,不做赘述,详细请参考吴军的原文。 分词问题的描述为:给定一个句子(字串),如: 南京市长江大桥 如何对这个句子进行分词(词串)才是最靠谱的。例如: 1. 南京市/长江大桥2. 南京/市长/江大桥 这两个分词,到底哪个更靠谱呢? 我们用贝叶斯公式来形式化地描述这个问题,令 X 为字串(句子),Y 为词串(一种特定的分词假设)。我们就是需要寻找使得 P(Y|X) 最大的 Y ,使用一次贝叶斯可得:P(Y|X) P(Y)*P(X|Y) 用自然语言来说就是 这种分词方式(词串)的可能性 乘以 这个词串生成我们的句子的可能性。我们进一步容易看到:可以近似地将 P(X|Y) 看作是恒等于 1 的,因为任意假想的一种分词方式之下生成我们的句子总是精准地生成的(只需把分词之间的分界符号扔掉即可)。于是,我们就变成了去最大化 P(Y) ,也就是寻找一种分词使得这个词串(句子)的概率最大化。而如何计算一个词串:W1, W2, W3, W4 . 的可能性呢?我们知道,根据联合概率的公式展开:P(W1, W2, W3, W4 .) = P(W1) * P(W2|W1) * P(W3|W2, W1) * P(W4|W1,W2,W3) * . 于是我们可以通过一系列的条件概率(右式)的乘积来求整个联合概率。然而不幸的是随着条件数目的增加(P(Wn|Wn-1,Wn-2,.,W1) 的条件有 n-1 个),数据稀疏问题也会越来越严重,即便语料库再大也无法统计出一个靠谱的 P(Wn|Wn-1,Wn-2,.,W1) 来。为了缓解这个问题,计算机科学家们一如既往地使用了“天真”假设:我们假设句子中一个词的出现概率只依赖于它前面的有限的 k 个词(k 一般不超过 3,如果只依赖于前面的一个词,就是2元语言模型(2-gram),同理有 3-gram 、 4-gram 等),这个就是所谓的“有限地平线”假设。 虽然上面这个假设很傻很天真,但结果却表明它的结果往往是很好很强大的,后面要提到的朴素贝叶斯方法使用的假设跟这个精神上是完全一致的,我们会解释为什么像这样一个天真的假设能够得到强大的结果。目前我们只要知道,有了这个假设,刚才那个乘积就可以改写成: P(W1) * P(W2|W1) * P(W3|W2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论