朴素贝叶斯是 一种经典的分类算法
贝叶斯定理
条件概率:记事件A发生的概率为P(A),事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(A|B)。
P(A|B)=P(AB)/P(B) 由此可以得P(AB)=P(A|B)*P(B)
即同理 P(AB)=P(B|A)*P(A)
即P(A|B)=P(B|A)*P(A)/P(B)
样例
下面是 随便列举的一堆数据
根据贝叶斯公式转化为分类任务的表达式为
P(类别|特征)=P(类别)* P(特征|类别)/ P(特征), 然后计算P(是 |品德好 性格不好 成绩差)和 P(不是 |品德好 性格不好 成绩差),选择是或不是。
解决步骤如下:
朴素贝叶斯对文本进行分类的python代码
import numpy as np from functools import reduce #创建一个实验样本 def loadDataSet(): dataSet= [['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']] classVec = [0,1,0,1,0,1] return dataSet,classVec # 创建一个包含在所有文档中出现的不重复词的词表 def createbvocabList(dataSet): vocabSet=set([])# 创建一个空集 for doc in dataSet: vocabSet=vocabSet|set(doc)# 创建两个集合的并集 vocabList=list(vocabSet) return vocabList # 将文档词条转换成词向量 def setOfWords2Vec(vocabList, inputSet): returnVec = [0]*len(vocabList)#创建一个其中所含元素都为0的向量 for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] = 1 else: print ("the word: %s is not in my Vocabulary!" % word) return returnVec #把实验数据中的每条文本转化为词向量 def get_trainMat(dataSet): trainMat=[] vocabList=createbvocabList(dataSet) for inputSet in dataSet: returnVec=setOfWords2Vec(vocabList,inputSet) trainMat.append(returnVec) return trainMat # 朴素贝叶斯分类器训练函数 从词向量计算概率 def trainNB(trainMat,classVec): n=len(trainMat)#文档数目 m=len(trainMat[0])#文档的词条数 pAb=sum(classVec)/n#文档属于侮辱类的 p0Num=np.ones(m) p1Num=np.ones(m) p0Denom=2 p1Denom=2 for i in range(n): if classVec[i]==1: p1Num+=trainMat[i] p1Denom+=sum(trainMat[i]) else: p0Num+=trainMat[i] p0Denom+=sum(trainMat[i]) p1V=np.log(p1Num/p1Denom)#拉普拉斯平滑,为了解决零概念事件 p0V=np.log(p0Num/p0Denom) return p0V,p1V,pAb def classifyNB(vec2Classify,p0V,p1V,pAb): p1=sum(vec2Classify*p1V)+np.log(pAb) p0=sum(vec2Classify*p0V)+np.log(1-pAb) print("p0",p0) print("p1",p1) if p1>p0: return 1 else: return 0 def testingNB(testVec): dataset,classVec=loadDataSet() vocabList=createbvocabList(dataset) trainMat=get_trainMat(dataset) p0V,p1V,pAb=trainNB(trainMat,classVec) thisone=setOfWords2Vec(vocabList,testVec) if classifyNB(thisone,p0V,p1V,pAb)==1: print("属于侮辱类") else: print("属于非侮辱类") testVec=["stupid","garbage"] print(testingNB(testVec)) testVec1=["love","my"] print(testingNB(testVec1))