朴素贝叶斯算法原理和实现

朴素贝叶斯分类算法原理

1.1 概述

贝叶斯分类算法时一大类分类算法的总称。贝叶斯分类算法以样本可能属于某类的概率来作为分类依据。朴素贝叶斯分类算法时贝叶斯分类算法中最简单的一种。
注:朴素的意思时条件概率独立性

1.2 算法思想

  • 朴素贝叶斯的思想是这样的:如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A。
    通俗来说比如,在某条大街上,有100人,其中有50个美国人,50个非洲人,看到一个讲英语的黑人,那么我们是怎么去判断他来自哪里?
    提取特征:
    肤色:黑,语言:英语

  • 先验知识:
    P(黑色|非洲人) = 0.8
    P(讲英语|非洲人)=0.1
    P(黑色|美国人)= 0.2
    P(讲英语|美国人)=0.9
    要判断的概率是:
    P(非洲人|(讲英语,黑色) )
    P(美国人|(讲英语,黑色) )

  • 思考过程:
    在这里插入图片描述
    P(非洲人|(讲英语,黑色) ) 的 分子= 0.1 * 0.8 *0.5 =0.04
    P(美国人|(讲英语,黑色) ) 的 分子= 0.9 *0.2 * 0.5 = 0.09
    从而比较这两个概率的大小就等价于比较这两个分子的值,可以得出结论,此人应该是:美国人。
    其蕴含的数学原理如下:
    p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)p(A)/p(y) p(xy)/p(xy)=p(A|x)p(A|y)
    朴素贝叶斯分类器
    在这里插入图片描述讲了上面的小故事,我们来朴素贝叶斯分类器的表示形式:
    当特征为为x时,计算所有类别的条件概率,选取条件概率最大的类别作为待分类的类别。由于上公式的分母对每个类别都是一样的,因此计算时可以不考虑分母,
    即朴素贝叶斯的朴素体现在其对各个条件的独立性假设上,加上独立假设后,大大减少了参数假设空间。

1.3 算法要点

1.3.1 算法步骤
  1. 分解各类先验样本数据中的特征;
  2. 计算各类数据中,各特征的条件概率;(比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)…)
  3. 分解待分类数据中的特征(特征1、特征2、特征3、特征4…)
  4. 计算各特征的各条件概率的乘积,如下所示:
    判断为A类的概率:p(A|特征1) * p(A|特征2) * p(A|特征3) * p(A|特征4)…
    判断为B类的概率:p(B|特征1) * p(B|特征2) * p(B|特征3) * p(B|特征4)…
    判断为C类的概率:p(C|特征1) * p(C|特征2) * p(C|特征3) * p(C|特征4)…
  5. 结果中的最大值就是该样本所属的类别
1.3.2 算法应用举例

大众点评、淘宝等电商上都会有大量的用户评论,比如:

  1. 衣服质量太差了!!!!颜色根本不纯!!!
  2. 我有一有种上当受骗的感觉!!!!
  3. 质量太差,衣服拿到手感觉像旧货!!!
  4. 上身漂亮,合身,很帅,给卖家点赞
  5. 穿上衣服帅呆了,给点一万个赞
  6. 我在他家买了三件衣服!!!!质量都很差!

其中1/2/3/6是差评,4/5是好评
现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如:
a. 这么差的衣服以后再也不买了
b. 帅,有逼格
……

1.3.3 算法应用流程
  1. 分解出先验数据中的各特征
    (即分词,比如“衣服”,“质量太差”,“差”,“不纯”,“帅”,“漂亮”,“赞” …)
  2. 计算各类别(好评、差评)中,各特征的条件概率
    (比如 p(“衣服” | 差评)、p(“衣服” | 好评)、p(“差”|好评)、p(“差”| 差评) …)
  3. 计算类别概率
    p(好评|(c1,c2,c5,c8))的分子=p(c1|好评) * p(c2|好评) * p(c3|好评) *…p(好评)
    p(差评|(c1,c2,c5,c8))的分子=p(c1|差评) * p(c2|差评) * p(c3|差评) *…p(差评)
    在这里插入图片描述
  4. 显然p(差评)的结果值更大,因此a被判别为"差评"

1.4 朴素贝叶斯分类算法案例

1.4.1 需求

利用大量邮件先验数据,使用朴素贝叶斯分类算法来自动识别垃圾邮件

1.4.2 python实现

#过滤垃圾邮件

    def textParse(bigString):      #正则表达式进行文本解析
          import re
          listOfTokens = re.split(r'\W*', bigString)
          return [tok.lower() for tok in listOfTokens if len(tok) > 2]
    
    def spamTest()
          docList = []; classList = []; fullText = []
          for i in range(1,26):     #导入并解析文本文件
                 wordList = textParse(open('email/spam/%d.txt'%i).read())
                 docList.append(wordList)
                 fullText.extend(wordList)
                 classList.append(1)
                 wordList = textParse(open('email/ham/%d.txt'%i).read())
                 docList.append(wordList)
                 fullText.extend(wordList)
                 classList.append(0)
          vocabList = createVocabList(docList)
          trainingSet = range(50);testSet = []
          for i in range(10):                  #随机构建训练集
                 randIndex = int(random.uniform(0, len(trainingSet)))
                 testSet.append(trainingSet[randIndex]) #随机挑选一个文档索引号放入测试集
                  del(trainingSet[randIndex])  #将该文档索引号从训练集中剔除
           trainMat = []; trainClasses = []
           for docIndex in trainingSet:
                  trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))
                  trainClasses.append(classList[docIndex])
           p0V,p1V,pSpam = trainNBO(array(trainMat), array(trainClasses))
           errorCount = 0
           for docIndex in testSet:        #对测试集进行分类
                 wordVector = setOfWords2Vec(vocabList, docList[docIndex])
                 if classifyNB(array(wordVector), p0V,p1V != classList[docIndex]:
                     errorCount +=1
            print 'the error rate is:', float(errorCount)/len(testSet)
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuxu1116

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值