朴素贝叶斯Python实例及解析


Posted in Python onNovember 19, 2018

本文实例为大家分享了Python朴素贝叶斯实例代码,供大家参考,具体内容如下

#-*- coding: utf-8 -*- #添加中文注释
from numpy import *
 
#过滤网站的恶意留言
#样本数据  
def loadDataSet():
  postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
         ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
         ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
         ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
         ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
         ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
  #类别标签:1侮辱性文字,0正常言论
  classVec = [0,1,0,1,0,1]   
  #返回文档向量,类别向量
  return postingList,classVec
 
#创建词汇表
#输入:dataSet已经经过切分处理
#输出:包含所有文档中出现的不重复词的列表             
def createVocabList(dataSet):
  #构建set集合,会返回不重复词表
  vocabSet = set([])
  #遍历每篇文档向量,扫描所有文档的单词 
  for document in dataSet:
    #通过set(document),获取document中不重复词列表
    vocabSet = vocabSet | set(document) #求并集
  return list(vocabSet)
 
#***词集模型:只考虑单词是否出现
#vocabList:词汇表
#inputSet :某个文档向量
def setOfWords2Vec(vocabList, inputSet):
  #创建所含元素全为0的向量
  returnVec = [0]*len(vocabList)
  #依次取出文档中的单词与词汇表进行对照,若在词汇表中出现则为1
  for word in inputSet:
    if word in vocabList:
    #单词在词汇表中出现,则记为1 
      returnVec[vocabList.index(word)] = 1 #词集模型
    #若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示
    else: print "the word: %s is not in my Vocabulary!" % word
  return returnVec
 
#====训练分类器,原始的朴素贝叶斯,没有优化=====
#输入trainMatrix:词向量数据集
#输入trainCategory:数据集对应的类别标签
#输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度
#输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度
#输出pAbusive:侮辱性言论在整个数据集中的比例
def trainNB00(trainMatrix,trainCategory):
  #numTrainDocs训练集总条数
  numTrainDocs = len(trainMatrix)
  #训练集中所有不重复单词总数
  numWords = len(trainMatrix[0])
  #侮辱类的概率(侮辱类占总训练数据的比例)
  pAbusive = sum(trainCategory)/float(numTrainDocs) 
  #*正常言论的类条件概率密度 p(某单词|正常言论)=p0Num/p0Denom
  p0Num = zeros(numWords); #初始化分子为0
  #*侮辱性言论的类条件概率密度 p(某单词|侮辱性言论)=p1Num/p1Denom  
  p1Num = zeros(numWords) #初始化分子为0
  #初始化分母置为0  
  p0Denom = 0; 
  p1Denom = 0        
  #遍历训练集数据  
  for i in range(numTrainDocs):
    #若为侮辱类
    if trainCategory[i] == 1:
      #统计侮辱类所有文档中的各个单词总数
      p1Num += trainMatrix[i]
      #p1Denom侮辱类总单词数
      p1Denom += sum(trainMatrix[i])
 
    #若为正常类
    else:
      #统计正常类所有文档中的各个单词总数
      p0Num += trainMatrix[i]
      #p0Denom正常类总单词数
      p0Denom += sum(trainMatrix[i])  
  #词汇表中的单词在侮辱性言论文档中的类条件概率  
  p1Vect = p1Num/p1Denom    
  #词汇表中的单词在正常性言论文档中的类条件概率 
  p0Vect = p0Num/p0Denom
  return p0Vect,p1Vect,pAbusive
 
 
#=====训练分类器,优化处理=====
#输入trainMatrix:词向量数据集
#输入trainCategory:数据集对应的类别标签
#输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度
#输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度
#输出pAbusive:侮辱性言论在整个数据集中的比例
def trainNB0(trainMatrix,trainCategory):
  #训练集总条数:行数
  numTrainDocs = len(trainMatrix)
  #训练集中所有单词总数:词向量维度
  numWords = len(trainMatrix[0])
  #侮辱类的概率(侮辱类占总训练数据的比例)
  pAbusive = sum(trainCategory)/float(numTrainDocs)  
  #*拉普拉斯平滑防止类条件概率为0,初始化分子为1,分母为2
  #正常类向量置为1
  p0Num = ones(numWords); #初始化分子为1
  #侮辱类向量置为1  
  p1Num = ones(numWords) #初始化分子为1
  #初始化分母置为2  
  p0Denom = 2.0; 
  p1Denom = 2.0        
  #遍历训练集每个样本  
  for i in range(numTrainDocs):
    #若为侮辱类
    if trainCategory[i] == 1:
      #统计侮辱类所有文档中的各个单词总数
      p1Num += trainMatrix[i] #向量
      #p1Denom侮辱类总单词数
      p1Denom += sum(trainMatrix[i])
 
    #若为正常类
    else:
      #统计正常类所有文档中的各个单词总数
      p0Num += trainMatrix[i]
      #p0Denom正常类总单词数
      p0Denom += sum(trainMatrix[i])  
  #数据取log,即单个单词的p(x1|c1)取log,防止下溢出    
  p1Vect = log(p1Num/p1Denom)     
  p0Vect = log(p0Num/p0Denom) 
  return p0Vect,p1Vect,pAbusive
 
#vec2Classify:待分类文档 
#p0Vect:词汇表中每个单词在训练样本的正常言论中的类条件概率密度
#p1Vect:词汇表中每个单词在训练样本的侮辱性言论中的类条件概率密度
#pClass1:侮辱性言论在训练集中所占的比例
def classifyNB(vec2Classify, p0Vect, p1Vect, pClass1):
  #在对数空间中进行计算,属于哪一类的概率比较大就判为哪一类
  #print'0p1=',sum(vec2Classify * p0Vect) #查看结果
  #print'0p0=',sum(vec2Classify * p0Vect)
  p1 = sum(vec2Classify * p1Vect) + log(pClass1)  
  p0 = sum(vec2Classify * p0Vect) + log(1.0 - pClass1)
  #print'p1=',p1
  #print'p0=',p0
  if p1 > p0:
    return 1
  else: 
    return 0
 
def testingNB():
  #获得训练数据,类别标签
  listOPosts,listClasses = loadDataSet()
  #创建词汇表
  myVocabList = createVocabList(listOPosts)
  #构建矩阵,存放训练数据
  trainMat=[]
 
  #遍历原始数据,转换为词向量,构成数据训练矩阵
  for postinDoc in listOPosts:
    #数据转换后存入数据训练矩阵trainMat中
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
  #训练分类器
  p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
 
  #===测试数据(1)
  testEntry = ['love', 'my', 'dalmation']
  #测试数据转为词向量
  thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
  #输出分类结果
  print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
 
  #===测试数据(2)
  testEntry = ['stupid', 'garbage']
  #测试数据转为词向量
  thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
  #输出分类结果
  print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)  
 
 
 
#***词袋模型:考虑单词出现的次数
#vocabList:词汇表
#inputSet :某个文档向量
def bagOfWords2VecMN(vocabList, inputSet):
  #创建所含元素全为0的向量
  returnVec = [0]*len(vocabList)
  #依次取出文档中的单词与词汇表进行对照,统计单词在文档中出现的次数
  for word in inputSet:
    if word in vocabList:
      #单词在文档中出现的次数
      returnVec[vocabList.index(word)] += 1
    #若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示
    else: print "the word: %s is not in my Vocabulary!" % word
  return returnVec
 
 
#准备数据,按空格切分出词 
#单词长度小于或等于2的全部丢弃
def textParse(bigString):  
  import re
  listOfTokens = re.split(r'\W*', bigString)
  #tok.lower() 将整个词转换为小写
  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('D:/work/python/email/spam/%d.txt' % i).read())  
    wordList = textParse(open('D:/machine learning/python/bayes/email/spam/%d.txt' % i).read())  
    #docList按篇存放文章
    docList.append(wordList)
    #fullText邮件内容存放到一起
    fullText.extend(wordList)
    #垃圾邮件类别标记为1
    classList.append(1)
 
    #读取正常邮件
    #wordList = textParse(open('D:/work/python/email/ham/%d.txt' % i).read())
    wordList = textParse(open('D:/machine learning/python/bayes/email/ham/%d.txt' % i).read())
    docList.append(wordList)
    fullText.extend(wordList)
    #正常邮件类别标记为0
    classList.append(0)
 
  #创建词典  
  vocabList = createVocabList(docList)
  #训练集共50篇文章
  trainingSet = range(50);
  #创建测试集
  testSet=[]
  #随机选取10篇文章为测试集,测试集中文章从训练集中删除  
  for i in range(10):
    #0-50间产生一个随机数
    randIndex = int(random.uniform(0,len(trainingSet)))
    #从训练集中找到对应文章,加入测试集中
    testSet.append(trainingSet[randIndex])
    #删除对应文章
    del(trainingSet[randIndex]) 
 
  #准备数据,用于训练分类器  
  trainMat=[]; #训练数据
  trainClasses = [] #类别标签
 
  #遍历训练集中文章数据
  for docIndex in trainingSet:
    #每篇文章转为词袋向量模型,存入trainMat数据矩阵中
    trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
    #trainClasses存放每篇文章的类别
    trainClasses.append(classList[docIndex])
  #训练分类器
  p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
 
  #errorCount记录测试数据出错次数
  errorCount = 0
  #遍历测试数据集,每条数据相当于一条文本
  for docIndex in testSet:
    #文本转换为词向量模型  
    wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
    #模型给出的分类结果与本身类别不一致时,说明模型出错,errorCount数加1
    if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
      errorCount += 1
      #输出出错的文章
      print "classification error",docList[docIndex]
 
  #输出错误率,即出错次数/总测试次数
  print 'the error rate is: ',float(errorCount)/len(testSet)
 
 
  #return vocabList,fullText
 
if __name__ == "__main__":
 
###**********************留言板数据:观察参数值start
###  #获取数据
  listOPosts,listClasses = loadDataSet() 
#  #构建词汇表
  myVocabList = createVocabList(listOPosts)
  print 'myVocabList=',myVocabList
  print 'result=',setOfWords2Vec(myVocabList, listOPosts[0])
  trainMat = []
  for postinDoc in listOPosts:
    #构建训练矩阵
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
  p0Vect,p1Vect,pAbusive = trainNB0(trainMat, listClasses)
  print 'p0Vect='
  print p0Vect
  print 'p1Vect='
  print p1Vect
  print 'pAbusive='
  print pAbusive
  print 'trainMatrix='
  print trainMat
  print 'listClasses=',listClasses
###**********************留言板数据:观察参数值end  
 
##  #测试留言板文档
  print'==================================='
  testingNB()
 
#***********************垃圾邮件  
##  #垃圾邮件分类
  print'=======spam filtering============='
  spamTest()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python代码解决RenderView窗口not found问题
Aug 28 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
python入门:这篇文章带你直接学会python
Sep 14 Python
Python3.5运算符操作实例详解
Apr 25 Python
Python中print和return的作用及区别解析
May 05 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Tensorflow 实现释放内存
Feb 03 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
5款实用的python 工具推荐
Oct 13 Python
详解python中的异常和文件读写
Jan 03 Python
python版大富翁源代码分享
Nov 19 #Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 #Python
python实现推箱子游戏
Mar 25 #Python
详解python中的Turtle函数库
Nov 19 #Python
python绘制简单彩虹图
Nov 19 #Python
python微信好友数据分析详解
Nov 19 #Python
python生成九宫格图片
Nov 19 #Python
You might like
几种显示数据的方法的比较
2006/10/09 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
AngularJS中的作用域实例分析
2018/05/16 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
python测试驱动开发实例
2014/10/08 Python
Python 基础教程之包和类的用法
2017/02/23 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
vscode调试django项目的方法
2020/08/06 Python
宿舍违规检讨书
2014/01/12 职场文书
保安公司服务承诺书
2014/05/28 职场文书
安全演讲稿开场白
2014/08/25 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
幼儿园辞职信
2015/05/13 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫