朴素贝叶斯Python实例及解析
本文实例为大家分享了Python朴素贝叶斯实例代码,供大家参考,具体内容如下
#-*-coding:utf-8-*-#添加中文注释
fromnumpyimport*
#过滤网站的恶意留言
#样本数据
defloadDataSet():
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]
#返回文档向量,类别向量
returnpostingList,classVec
#创建词汇表
#输入:dataSet已经经过切分处理
#输出:包含所有文档中出现的不重复词的列表
defcreateVocabList(dataSet):
#构建set集合,会返回不重复词表
vocabSet=set([])
#遍历每篇文档向量,扫描所有文档的单词
fordocumentindataSet:
#通过set(document),获取document中不重复词列表
vocabSet=vocabSet|set(document)#求并集
returnlist(vocabSet)
#***词集模型:只考虑单词是否出现
#vocabList:词汇表
#inputSet:某个文档向量
defsetOfWords2Vec(vocabList,inputSet):
#创建所含元素全为0的向量
returnVec=[0]*len(vocabList)
#依次取出文档中的单词与词汇表进行对照,若在词汇表中出现则为1
forwordininputSet:
ifwordinvocabList:
#单词在词汇表中出现,则记为1
returnVec[vocabList.index(word)]=1#词集模型
#若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示
else:print"theword:%sisnotinmyVocabulary!"%word
returnreturnVec
#====训练分类器,原始的朴素贝叶斯,没有优化=====
#输入trainMatrix:词向量数据集
#输入trainCategory:数据集对应的类别标签
#输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度
#输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度
#输出pAbusive:侮辱性言论在整个数据集中的比例
deftrainNB00(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
#遍历训练集数据
foriinrange(numTrainDocs):
#若为侮辱类
iftrainCategory[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
returnp0Vect,p1Vect,pAbusive
#=====训练分类器,优化处理=====
#输入trainMatrix:词向量数据集
#输入trainCategory:数据集对应的类别标签
#输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度
#输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度
#输出pAbusive:侮辱性言论在整个数据集中的比例
deftrainNB0(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
#遍历训练集每个样本
foriinrange(numTrainDocs):
#若为侮辱类
iftrainCategory[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)
returnp0Vect,p1Vect,pAbusive
#vec2Classify:待分类文档
#p0Vect:词汇表中每个单词在训练样本的正常言论中的类条件概率密度
#p1Vect:词汇表中每个单词在训练样本的侮辱性言论中的类条件概率密度
#pClass1:侮辱性言论在训练集中所占的比例
defclassifyNB(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
ifp1>p0:
return1
else:
return0
deftestingNB():
#获得训练数据,类别标签
listOPosts,listClasses=loadDataSet()
#创建词汇表
myVocabList=createVocabList(listOPosts)
#构建矩阵,存放训练数据
trainMat=[]
#遍历原始数据,转换为词向量,构成数据训练矩阵
forpostinDocinlistOPosts:
#数据转换后存入数据训练矩阵trainMat中
trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
#训练分类器
p0V,p1V,pAb=trainNB0(array(trainMat),array(listClasses))
#===测试数据(1)
testEntry=['love','my','dalmation']
#测试数据转为词向量
thisDoc=array(setOfWords2Vec(myVocabList,testEntry))
#输出分类结果
printtestEntry,'classifiedas:',classifyNB(thisDoc,p0V,p1V,pAb)
#===测试数据(2)
testEntry=['stupid','garbage']
#测试数据转为词向量
thisDoc=array(setOfWords2Vec(myVocabList,testEntry))
#输出分类结果
printtestEntry,'classifiedas:',classifyNB(thisDoc,p0V,p1V,pAb)
#***词袋模型:考虑单词出现的次数
#vocabList:词汇表
#inputSet:某个文档向量
defbagOfWords2VecMN(vocabList,inputSet):
#创建所含元素全为0的向量
returnVec=[0]*len(vocabList)
#依次取出文档中的单词与词汇表进行对照,统计单词在文档中出现的次数
forwordininputSet:
ifwordinvocabList:
#单词在文档中出现的次数
returnVec[vocabList.index(word)]+=1
#若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示
else:print"theword:%sisnotinmyVocabulary!"%word
returnreturnVec
#准备数据,按空格切分出词
#单词长度小于或等于2的全部丢弃
deftextParse(bigString):
importre
listOfTokens=re.split(r'\W*',bigString)
#tok.lower()将整个词转换为小写
return[tok.lower()fortokinlistOfTokensiflen(tok)>2]
defspamTest():
#文章按篇存放
docList=[];
#存放文章类别
classList=[];
#存放所有文章内容
fullText=[]
foriinrange(1,26):
#读取垃圾邮件
#wordList=textParse(open('D:/work/python/email/spam/%d.txt'%i).read())
wordList=textParse(open('D:/machinelearning/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:/machinelearning/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篇文章为测试集,测试集中文章从训练集中删除
foriinrange(10):
#0-50间产生一个随机数
randIndex=int(random.uniform(0,len(trainingSet)))
#从训练集中找到对应文章,加入测试集中
testSet.append(trainingSet[randIndex])
#删除对应文章
del(trainingSet[randIndex])
#准备数据,用于训练分类器
trainMat=[];#训练数据
trainClasses=[]#类别标签
#遍历训练集中文章数据
fordocIndexintrainingSet:
#每篇文章转为词袋向量模型,存入trainMat数据矩阵中
trainMat.append(bagOfWords2VecMN(vocabList,docList[docIndex]))
#trainClasses存放每篇文章的类别
trainClasses.append(classList[docIndex])
#训练分类器
p0V,p1V,pSpam=trainNB0(array(trainMat),array(trainClasses))
#errorCount记录测试数据出错次数
errorCount=0
#遍历测试数据集,每条数据相当于一条文本
fordocIndexintestSet:
#文本转换为词向量模型
wordVector=bagOfWords2VecMN(vocabList,docList[docIndex])
#模型给出的分类结果与本身类别不一致时,说明模型出错,errorCount数加1
ifclassifyNB(array(wordVector),p0V,p1V,pSpam)!=classList[docIndex]:
errorCount+=1
#输出出错的文章
print"classificationerror",docList[docIndex]
#输出错误率,即出错次数/总测试次数
print'theerrorrateis:',float(errorCount)/len(testSet)
#returnvocabList,fullText
if__name__=="__main__":
###**********************留言板数据:观察参数值start
####获取数据
listOPosts,listClasses=loadDataSet()
##构建词汇表
myVocabList=createVocabList(listOPosts)
print'myVocabList=',myVocabList
print'result=',setOfWords2Vec(myVocabList,listOPosts[0])
trainMat=[]
forpostinDocinlistOPosts:
#构建训练矩阵
trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
p0Vect,p1Vect,pAbusive=trainNB0(trainMat,listClasses)
print'p0Vect='
printp0Vect
print'p1Vect='
printp1Vect
print'pAbusive='
printpAbusive
print'trainMatrix='
printtrainMat
print'listClasses=',listClasses
###**********************留言板数据:观察参数值end
###测试留言板文档
print'==================================='
testingNB()
#***********************垃圾邮件
###垃圾邮件分类
print'=======spamfiltering============='
spamTest()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。