当前位置: 移动技术网 > IT编程>脚本编程>Python > 朴素贝叶斯Python实例及解析

朴素贝叶斯Python实例及解析

2018年11月30日  | 移动技术网IT编程  | 我要评论

刺客信条大革命存档,中国智能交通,车模型

本文实例为大家分享了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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网