资源描述:
《R语言与机器学习(3)朴素贝叶斯》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、算法三:朴素贝叶斯算法 前两个算法都被要求做出一个艰难的决定,给出数据所属分类的明确答案,但往往因为分类特征统计不足,或者分类特征选择有误导致了错误的分类结果,哪怕是训练集也有可能出现不能正确分类的情形。这时,前两种方法都如同现实生活一样是用“少数服从多数”的办法来做出决策。正如帕斯卡指出的:“少数服从多数未必是因为多数人更正义,而是多数人更加强力”,所以为了保证“少数人的权利”,我们要求分类器给出一个最优的猜测结果,同时给出猜测的概率估计值。贝叶斯统计基础在说朴素贝叶斯算法之前,还是要说说贝叶斯统计,关于贝叶斯统计,这里只给出最最最基本的简述,其余的还请参阅furtherreadi
2、ng中的《数学之美番外篇:平凡而又神奇的贝叶斯方法》先说贝叶斯公式:定义:设A、B是两个事件,且P(A)>0,称P(B
3、A)=P(AB)/P(A)为在事件A发生的条件下事件B发生的条件概率。相关公式:乘法公式P(XYZ)=P(Z
4、XY)P(Y
5、X)P(X)全概率公式P(X)=P(X
6、Y1)+P(X
7、Y2)+…+P(X
8、Yn)贝叶斯公式: 如上所示,其中P(A
9、B)是在B发生的情况下A发生的可能性。在贝叶斯定理中,每个名词都有约定俗成的名称:P(A)是A的先验概率或边缘概率。之所以称为"先验"是因為它不考虑任何B方面的因素。P(A
10、B)是已知B发生后A的条件概率(直白来讲,就是先有B而
11、后=>才有A),也由于得自B的取值而被称作A的后验概率。P(B
12、A)是已知A发生后B的条件概率(直白来讲,就是先有A而后=>才有B),也由于得自A的取值而被称作B的后验概率。P(B)是B的先验概率或边缘概率,也作标准化常量。按这些术语,Bayes定理可表述为:后验概率=(相似度*先验概率)/标准化常量,也就是說,后验概率与先验概率和相似度的乘积成正比。另外,比例P(B
13、A)/P(B)也有时被称作标准相似度,Bayes定理可表述为:后验概率=标准相似度*先验概率。朴素贝叶斯再说说朴素贝叶斯,朴素贝叶斯在英文中叫做naiveBayes,是不是这个贝叶斯方法toosimple,someti
14、mesnaive呢?我们一起来看看他的基本假设:条件独立性。给定类标号A,朴素贝叶斯分类器在估计类条件概率时假设属性之间条件独立。条件独立假设可以形式化的表达如下:P(B
15、A)=P(b1
16、A)*P(b2
17、A)*…*P(bn
18、A)其中每个训练样本可用一个属性向量B=(b1,b2,b3,…,bn)表示,各个属性之间条件独立。比如,对于一篇文章,“Goodgoodstudy,Daydayup.”可以用一个文本特征向量来表示,x=(Good,good,study,Day,day,up)。一般各个词语之间肯定不是相互独立的,有一定的上下文联系。但在朴素贝叶斯文本分类时,我们假设个单词之间没有联
19、系,可以用一个文本特征向量来表示这篇文章,这就是“朴素”的来历。有了条件独立假设,就不必计算X和Y的每一种组合的类条件概率,只需对给定的Y,计算每个xi的条件概率。后一种方法更实用,因为它不需要很大的训练集就能获得较好的概率估计。其实这种条件独立也不是在日常中看不到,比如Markov过程,再比如我们前面说的脊椎动物数据集的各个指标都可以看作条件独立的(前者是严格的,后者是近似的)我们为了说明这个问题,使用TomMitchell的《机器学习》一书的playingtennis数据集(点击这里下载本文所有代码及用到数据集)来说明这个问题。R代码如下:data<-read.csv("D:/R
20、/data/playingtennis.csv")data<-data[,-1]#去掉了日期这一个没有可作为分类变量价值的变量prior.yes<-sum(data[,5]=="Yes")/length(data[,5]);prior.no<-sum(data[,5]=="No")/length(data[,5]); bayespre<-function(condition){post.yes<-sum((data[,1]==condition[1])&(data[,5]=="Yes"))/sum(data[,5]=="Yes")*sum((data[,2]==condition[2
21、])&(data[,5]=="Yes"))/sum(data[,5]=="Yes")*sum((data[,3]==condition[3])&(data[,5]=="Yes"))/sum(data[,5]=="Yes")*sum((data[,4]==condition[4])&(data[,5]=="Yes"))/sum(data[,5]=="Yes")*prior.yes; post.no<-sum((data[,1]==condition[1])&