朴素贝叶斯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实现二分法算法实例
Feb 02 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
python的中异常处理机制
Aug 30 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 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 数组实例说明
2008/08/18 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
jQuery 表格插件整理
2010/04/27 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python网络爬虫实例讲解
2016/04/28 Python
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
学生检讨书怎么写
2015/05/07 职场文书
行政处罚听证告知书
2015/07/01 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
Python极值整数的边界探讨分析
2021/09/15 Python