朴素贝叶斯Python实例及解析
程序员文章站
2023-11-22 09:30:46
本文实例为大家分享了python朴素贝叶斯实例代码,供大家参考,具体内容如下
#-*- coding: utf-8 -*- #添加中文注释
from numpy...
本文实例为大家分享了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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。