R语言与机器学习学习笔记(分类算法)(3)朴素贝叶斯算法

算法三:朴素贝叶斯算法

           前两个算法都被要求做出一个艰难的决定,给出数据所属分类的明确答案,但往往因为分类特征统计不足,或者分类特征选择有误导致了错误的分类结果,哪怕是训练集也有可能出现不能正确分类的情形。这时,前两种方法都如同现实生活一样是用“少数服从多数”的办法来做出决策。正如帕斯卡指出的:“少数服从多数未必是因为多数人更正义,而是多数人更加强力”,所以为了保证“少数人的权利”,我们要求分类器给出一个最优的猜测结果,同时给出猜测的概率估计值。

贝叶斯统计基础

        在说朴素贝叶斯算法之前,还是要说说贝叶斯统计,关于贝叶斯统计,这里只给出最最最基本的简述,其余的还请参阅further reading中的《数学之美番外篇:平凡而又神奇的贝叶斯方法》

      先说贝叶斯公式:

定义:设A、B是两个事件,且P(A)>0,称

          P(B|A)=P(AB)/P(A)

为在事件A发生的条件下事件B发生的条件概率

      相关公式:

乘法公式 P(XYZ)=P(Z|XY)P(Y|X)P(X)

全概率公式 P(X)=P(XY1)+ P(XY2)+…+ P(XYn)

贝叶斯公式


        如上所示,其中P(A|B)是在B发生的情况下A发生的可能性。在贝叶斯定理中,每个名词都有约定俗成的名称:

  • P(A)是A的先验概率或边缘概率。之所以称为"先验"是因為它不考虑任何B方面的因素。
  • P(A|B)是已知B发生后A的条件概率(直白来讲,就是先有B而后=>才有A),也由于得自B的取值而被称作A的后验概率
  • P(B|A)是已知A发生后B的条件概率(直白来讲,就是先有A而后=>才有B),也由于得自A的取值而被称作B的后验概率。
  • P(B)是B的先验概率或边缘概率,也作标准化常量。

         按这些术语,Bayes定理可表述为:后验概率 = (相似度*先验概率)/标准化常量,也就是說,后验概率与先验概率和相似度的乘积成正比。另外,比例 P(B|A)/P(B)也有时被称作标准相似度,Bayes定理可表述为:后验概率 =标准相似度*先验概率。

朴素贝叶斯

        再说说朴素贝叶斯,朴素贝叶斯在英文中叫做naive Bayes,是不是这个贝叶斯方法too simple,sometimes naive呢?我们一起来看看他的基本假设:条件独立性。

        给定类标号A,朴素贝叶斯分类器在估计类条件概率时假设属性之间条件独立。条件独立假设可以形式化的表达如下:

 P(B|A)=P(b1|A)*P(b2|A)*…*P(bn|A)

         其中每个训练样本可用一个属性向量B=(b1,b2,b3,…,bn)表示,各个属性之间条件独立。

         比如,对于一篇文章,

“Good good study, Day day up.”

         可以用一个文本特征向量来表示,x=(Good, good, study, Day, day , up)。一般各个词语之间肯定不是相互独立的,有一定的上下文联系。但在朴素贝叶斯文本分类时,我们假设个单词之间没有联系,可以用一个文本特征向量来表示这篇文章,这就是“朴素”的来历。

        有了条件独立假设,就不必计算X和Y的每一种组合的类条件概率,只需对给定的Y,计算每个xi的条件概率。后一种方法更实用,因为它不需要很大的训练集就能获得较好的概率估计。

       其实这种条件独立也不是在日常中看不到,比如Markov过程,再比如我们前面说的脊椎动物数据集的各个指标都可以看作条件独立的(前者是严格的,后者是近似的)

       我们为了说明这个问题,使用Tom Mitchell的《机器学习》一书的playing tennis数据集(点击这里下载本文所有代码及用到数据集)来说明这个问题。R代码如下:

data <-read.csv("D:/R/data/playing tennis.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]) & (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]) & (data[,5] == "No")) /sum(data[,5] == "No") *
   sum((data[,2] == condition[2]) & (data[,5] == "No")) /sum(data[,5] == "No") *
   sum((data[,3] == condition[3]) & (data[,5] == "No")) /sum(data[,5] == "No") *
  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值