朴素贝叶斯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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
Mar 22 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
aws 通过boto3 python脚本打pach的实现方法
May 10 Python
Python中无限循环需要什么条件
May 27 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
Mar 02 Python
Python作用域和名称空间的详细介绍
Apr 13 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
推荐php模板技术[转]
2007/01/04 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
PHP7匿名类用法分析
2016/09/26 PHP
对联广告js flash激活
2006/10/19 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
Python简单进程锁代码实例
2015/04/27 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
wxpython绘制音频效果
2019/11/18 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Python读取yaml文件的详细教程
2020/07/21 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
社区十八大感言
2014/01/19 职场文书
结婚周年感言
2014/02/24 职场文书
委托书怎样写
2014/08/30 职场文书
在职证明书模板
2015/06/15 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书