实例

上一章介绍了贝叶斯分类的理论基础,下面举个例子说明。
有如下数据集:

P(Y=1)=915,P(Y=−1)=615P(Y=1)=\frac{9}{15},P(Y=-1)=\frac{6}{15}
对特征X(1),Y=1X^{(1)},Y=1
P(X(1)=1|Y=1)=29,P(X(1)=2|Y=1)=39,P(X(1)=3|Y=1)=49P(X^{(1)}=1|Y=1)=\frac{2}{9},P(X^{(1)}=2|Y=1)=\frac{3}{9},P(X^{(1)}=3|Y=1)=\frac{4}{9}
对特征X(2),Y=1X^{(2)},Y=1
P(X(2)=S|Y=1)=19,P(X(2)=M|Y=1)=49,P(X(2)=L|Y=1)=49P(X^{(2)}=S|Y=1)=\frac{1}{9},P(X^{(2)}=M|Y=1)=\frac{4}{9},P(X^{(2)}=L|Y=1)=\frac{4}{9}
对特征X(1),Y=−1X^{(1)},Y=-1
P(X(1)=1|Y=−1)=36,P(X(1)=2|Y=−1)=26,P(X(1)=3|Y=−1)=16P(X^{(1)}=1|Y=-1)=\frac{3}{6},P(X^{(1)}=2|Y=-1)=\frac{2}{6},P(X^{(1)}=3|Y=-1)=\frac{1}{6}
对特征X(2),Y=−1X^{(2)},Y=-1
P(X(2)=S|Y=−1)=36,P(X(2)=M|Y=−1)=26,P(X(2)=L|Y=−1)=16P(X^{(2)}=S|Y=-1)=\frac{3}{6},P(X^{(2)}=M|Y=-1)=\frac{2}{6},P(X^{(2)}=L|Y=-1)=\frac{1}{6}
对于给定的x=(2,S)Tx=(2,S)^T

只需对X(1)=2和X(2)=SX^{(1)}=2和X^{(2)}=S时候的进行判断
P(Y=1)P(X(1)=2|Y=1)P(X(2)=S|Y=1)=915∗39∗19=145P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{9}{15}*\frac{3}{9}*\frac{1}{9}=\frac{1}{45}
P(Y=−1)P(X(1)=2|Y=−1)P(X(2)=S|Y=−1)=615∗26∗36=345P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{6}{15}*\frac{2}{6}*\frac{3}{6}=\frac{3}{45}
则属于 −1-1类

邮件分类

提取词汇表

提取所有邮件中的词汇,组成词汇表,这里的词汇表中每个单词只能出现一次。

def loadDataSet():postingList=[['my','dog','has','flea','problem','help','please'],['maybe','not','take','him','to','dog','park','stupid'],['my','dalmation','is','so','cute','I','love','him'],['stop','posting','stupid','workless','garbage'],['mr','licks','ate','my','steak','how','to','stop','him'],['quit','buying','worthless','dog','food','stupid']]classVec = [0,1,0,1,0,1]return postingList,classVecdef creatVocabList(dataSet):vocabSet = set([])for document in dataSet:vocabSet = vocabSet|set(document)return list(vocabSet)def setOfWords2Vec(vocabList,inputSet):returnVec = [0]*len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1else: print "the word :%s is not in my vocabulary. "%wordreturn returnVec

loadDataSet()loadDataSet()是测试的数据
createVocabList()createVocabList()创建词汇表,setset是元素只能出现一次的集合,||是Python中的并集的一次,在集合中不断的加入新的词汇。
setOfWordsVec()setOfWordsVec()函数,输入参数是词汇表和要判断的文档,这里的判断是,只要文档中的原始在词汇表中出现了无论你出现几次,就值为1,返回的向量是和词汇表等长,只包含0,10,1的向量,代表对于位置是否在词汇表中出现。
该函数被称为词集模型,记录单词是否出现。

算法过程

P(ck|w)=P(w|ck)P(ck)P(w)=P(w0|ck)P(w1|ck),...,P(wn|ck)P(w)P(c_k|w)=\frac{P(w|c_k)P(c_k)}{P(w)}=\frac{P(w_0|c_k)P(w_1|c_k),...,P(w_n|c_k)}{P(w)}

计算每个类别中的文档数目

对每篇训练文档:
===对每个类别:
======如果词条出现在文档中,则增加该词条的计数
======增加所有出现词条的计数值
===对每个类别:
======对每个词条:
=========将该词条的数目除以总词条的数目得到条件概率
===返回每个类别的条件概率

def trainNB0(trainMatrix,trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix[0])pAbusive = sum(trainCategory)/float(numTrainDocs)# p0Num = zeros(numWords)# p1Num = zeros(numWords)# p0Denom = 0.0# p1Denom = 0.0p0Num = ones(numWords)p1Num = ones(numWords)p0Denom = 2.0p1Denom = 2.0for i in range(numTrainDocs):if trainCategory[i]==1:p1Num+=trainMatrix[i]p1Denom+=sum(trainMatrix[i])else:p0Num+=trainMatrix[i]p0Denom+=sum(trainMatrix[i])# p1Vect = p1Num/p1Denom# p0Vect = p0Num/p0Denomp1Vect = log(p1Num/p1Denom)p0Vect = log(p0Num/p0Denom)return p0Vect,p1Vect,pAbusive

上面的函数返回了条件概率和先验概率
为防止出现0的情况,对其中注释部分进行了修改

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):p1 = sum(vec2Classify*p1Vec)+log(pClass1)p0 = sum(vec2Classify*p0Vec)+log(1.0-pClass1)if p1>p0:return 1 else :return 0

上面的函数根据先验概率和条件概率,计算该邮件所属邮件的类别

def bagOfwords2VecMN(vocabList,inputSet):returnVec = [0]*len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)]+=1return returnVec

该函数被称为词袋模型,统计每个单词出现的次数。

def textParse(bigString):import relistOfTokens = re.split(r'\W*',bigString)return [tok.lower() for tok in listOfTokens if len(tok)>3]

将字符转换成小写,并过滤掉长度小于3的单词

def spamTest():docList= []classList= []fullText=[]for i in range(1,26):wordList = textParse(open('email/spam/%d.txt'%i).read())docList.append(wordList)fullText.append(wordList)classList.append(1)wordList = textParse(open('email/ham/%d.txt'%i).read())docList.append(wordList)fullText.append(wordList)classList.append(0)vocabList = creatVocabList(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(bagOfwords2VecMN(vocabList,docList[docIndex]))trainClasses.append(classList[docIndex])p0V,p1V,pSpam= trainNB0(array(trainMat),array(trainClasses))errorCount = 0for docIndex in testSet:wordVector= bagOfwords2VecMN(vocabList,docList[docIndex])if classifyNB(array(wordVector),p0V,p1V,pSpam)!= classList[docIndex]:errorCount+=1print 'error email:',docList[docIndex]print 'the error rate is:',float(errorCount)/len(testSet)

测试程序
在50封邮件中,正常邮件和垃圾邮件各占25,在在其中随机抽取10封电子邮件,预测其所在的类别。

运行几次发现错误率在6-10%之间。

总结

1.朴素贝叶斯分类分类的结果受类的均衡程度影响比较大,如果某个类的数据比较多,则其先验概率比较大,很可能使测试数据都分到这个类,所有在分类时候要对类别的数据进行均衡。
2.邮件分类的词汇表是训练集所有的单词组成的
在计算后条件概率的时候,实际上把正类邮件在一起考虑,负类邮件在一起考虑。
若被分到正类,计算测试邮件中单词,在词汇表中出现的每个单词出现的概率,也即条件概率。训练集中正类所占的比例就是先验概率。每个单词的条件概率的乘积再乘以先验概率就是,该测试样本属于正类的概率。
负类,同上
3.在提取单词作为词汇表时候,要过滤掉单词长度比较短的如:is 、a 、an、the,等,至于过录掉长度为几的单词,需要自己测试。
4.在朴素贝叶斯定理中我们认为特征之间是相互独立的,然而邮件中的单词不一定是相互独立的。
5.对于一些复杂的邮件,受特点的词汇影响比较大分类的准确率会很差的。比如:恐怖分子在准备发生恐怖袭击的时候,邮件讨论的话题一定是关于炸弹、弹药的词汇。然而如果是个弹药专家,ta的邮件中也弹药方面的词汇也是比较多的,不能直接简单的根据条件概率判断,邮件的发送者的身份对邮件的内容影响比较大,同时许多情况下邮件的发送者身份有不知道,所有要添加人工因素(这个我就不知道了),来提高准确率。

朴素贝叶斯之邮件分类相关推荐

  1. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  2. python实现朴素贝叶斯垃圾邮件分类

    查看通俗易懂的贝叶斯垃圾邮件分类原理 请点击此处 下载邮件数据 请点击此处 import os import re import string import math import numpy as ...

  3. 朴素贝叶斯-垃圾邮件分类实现

    1. 前言 <朴素贝叶斯算法(Naive Bayes)>,介绍了朴素贝叶斯原理.本文介绍的是朴素贝叶斯的基础实现,用来垃圾邮件分类. 2. 朴素贝叶斯基础实现 朴素贝叶斯 (naive B ...

  4. 朴素贝叶斯-垃圾邮件(中文的)处理

    #coding=utf-8 from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np import jie ...

  5. 基于朴素贝叶斯实现文本分类

    基于朴素贝叶斯实现文本分类 数据集介绍 数据集为网上公开的新闻数据,其中数据集包含10个类别. 模型选择 贝叶斯分类 贝叶斯公式 朴素贝叶斯 拉普拉斯平滑引入 某个属性的条件概率为0,则会导致整体概率 ...

  6. 机器学习(六)--------python实现朴素贝叶斯对email分类

    贝叶斯分类 4.1 贝叶斯定理 计算条件概率 4.2 朴素贝叶斯分类 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 该方法受限于当特征属性有条件独立或基本独立. 4.3 贝叶斯网络 贝叶斯网络也成为信念 ...

  7. python朴素贝叶斯的文本分类_自给自足,完全手写一个朴素贝叶斯分类器,完成文本分类...

    Part 1: 本文解决的问题: 我在有这样的一个数据集,里面存放了人们对近期播放电影的评价,当然评价也就分成两部分,好评和差评.我们想利用这些数据训练一个模型,然后可以自动的对影评做出判断,到底是好 ...

  8. 基于朴素贝叶斯的文本分类算法

    基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机.K-近邻算法和朴素贝叶斯.其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用.本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模 ...

  9. 七、朴素贝叶斯中文文本分类

    1.朴素贝叶斯中文文本分类 中文分词 停用词 朴素贝叶斯中文分类举例:新闻文档分类 朴素贝叶斯中文分类的具体过程:加载停用词.中文分词.文本向量化.模型训练和保存.模型的加载和预测. 2 中文分词 2 ...

  10. 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战

    基于朴素贝叶斯的文本分类方法 一.朴素贝叶斯原理的介绍 二.朴素贝叶斯分类器的代码实现 分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时会给出这个猜测的概率估计值.朴素贝叶 ...

最新文章

  1. Facebook AI指出:CNN的padding机制,存在一大缺陷
  2. C语言棋盘中的正方形,C语言DFS(4)____棋盘问题
  3. [C++] 用Xcode来写C++程序[6] Name visibility
  4. 【线段树】【LCT】【LCA】树点涂色(luogu 3703)
  5. 解决:无法添加符号: DSO missing from command line
  6. cesium api 学习之旋转角 heading(yaw)、pitch、roll
  7. 天使、A轮、B轮……公司不同阶段估值方法大全
  8. 洛谷 P1538 迎春舞会之数字舞蹈
  9. java小程序贪吃蛇代码_微信小程序Demo之贪食蛇
  10. Tableau雷达图制作——这可能是你能看到最详尽,最清爽,最感人的教程!
  11. cmake命令之foreach
  12. guava学习:RangeSet
  13. 【Pytorch with fastai】第 14 章 :ResNet
  14. 只用mysql实现银行转账_基于mysql数据库银行转账功能实现
  15. 构建推荐系统:用 Netflix 电影评价数据集练练手
  16. 中国大学生计算机设计大赛--软件应用与开发类--经验总结
  17. AWS的ssl证书申请及使用
  18. ASP.NET Core中使用滑动窗口限流
  19. 谷歌地图Api部分使用
  20. 题解-今日头条2018校招后端方向(第四批)

热门文章

  1. 爬虫--网络数据采集
  2. java 观察者模式类图_设计模式——观察者模式
  3. pb定时器timer
  4. Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
  5. 场景法测试用例设计详解
  6. 巧用PPT模板,远离翻车风险
  7. APK安装流程:点击下载应用了解安装的全过程
  8. 24V单节锂电池充电芯片
  9. SPSS 独立样本t检验方法
  10. ArcFace: AdditiveAngularMarginLossforDeepFaceRecognition