Python实现的朴素贝叶斯分类器示例
本文实例讲述了Python实现的朴素贝叶斯分类器。分享给大家供大家参考,具体如下:
因工作中需要,自己写了一个朴素贝叶斯分类器。
对于未出现的属性,采取了拉普拉斯平滑,避免未出现的属性的概率为零导致整个条件概率都为零的情况出现。
朴素贝叶斯的基本原理网上很容易查到,这里不再叙述,直接附上代码
因工作中需要,自己写了一个朴素贝叶斯分类器。对于未出现的属性,采取了拉普拉斯平滑,避免未出现的属性的概率为零导致整个条件概率都为零的情况出现。
classNBClassify(object): def__init__(self,fillNa=1): self.fillNa=1 pass deftrain(self,trainSet): #计算每种类别的概率 #保存所有tag的所有种类,及它们出现的频次 dictTag={} forsubTupleintrainSet: dictTag[str(subTuple[1])]=1ifstr(subTuple[1])notindictTag.keys()elsedictTag[str(subTuple[1])]+1 #保存每个tag本身的概率 tagProbablity={} totalFreq=sum([valueforvalueindictTag.values()]) forkey,valueindictTag.items(): tagProbablity[key]=value/totalFreq #print(tagProbablity) self.tagProbablity=tagProbablity ############################################################################## #计算特征的条件概率 #保存特征属性基本信息{特征1:{值1:出现5次,值2:出现1次},特征2:{值1:出现1次,值2:出现5次}} dictFeaturesBase={} forsubTupleintrainSet: forkey,valueinsubTuple[0].items(): ifkeynotindictFeaturesBase.keys(): dictFeaturesBase[key]={value:1} else: ifvaluenotindictFeaturesBase[key].keys(): dictFeaturesBase[key][value]=1 else: dictFeaturesBase[key][value]+=1 #dictFeaturesBase={ #'职业':{'农夫':1,'教师':2,'建筑工人':2,'护士':1}, #'症状':{'打喷嚏':3,'头痛':3} #} dictFeatures={}.fromkeys([keyforkeyindictTag]) forkeyindictFeatures.keys(): dictFeatures[key]={}.fromkeys([keyforkeyindictFeaturesBase]) forkey,valueindictFeatures.items(): forsubkeyinvalue.keys(): value[subkey]={}.fromkeys([xforxindictFeaturesBase[subkey].keys()]) #dictFeatures={ #'感冒':{'症状':{'打喷嚏':None,'头痛':None},'职业':{'护士':None,'农夫':None,'建筑工人':None,'教师':None}}, #'脑震荡':{'症状':{'打喷嚏':None,'头痛':None},'职业':{'护士':None,'农夫':None,'建筑工人':None,'教师':None}}, #'过敏':{'症状':{'打喷嚏':None,'头痛':None},'职业':{'护士':None,'农夫':None,'建筑工人':None,'教师':None}} #} #initialisedictFeatures forsubTupleintrainSet: forkey,valueinsubTuple[0].items(): dictFeatures[subTuple[1]][key][value]=1ifdictFeatures[subTuple[1]][key][value]==NoneelsedictFeatures[subTuple[1]][key][value]+1 #print(dictFeatures) #将驯良样本中没有的项目,由None改为一个非常小的数值,表示其概率极小而并非是零 fortag,featuresDictindictFeatures.items(): forfeatureName,fetureValueDictinfeaturesDict.items(): forfeatureKey,featureValuesinfetureValueDict.items(): iffeatureValues==None: fetureValueDict[featureKey]=1 #由特征频率计算特征的条件概率P(feature|tag) fortag,featuresDictindictFeatures.items(): forfeatureName,fetureValueDictinfeaturesDict.items(): totalCount=sum([xforxinfetureValueDict.values()ifx!=None]) forfeatureKey,featureValuesinfetureValueDict.items(): fetureValueDict[featureKey]=featureValues/totalCountiffeatureValues!=NoneelseNone self.featuresProbablity=dictFeatures ############################################################################## defclassify(self,featureDict): resultDict={} #计算每个tag的条件概率 forkey,valueinself.tagProbablity.items(): iNumList=[] forf,vinfeatureDict.items(): ifself.featuresProbablity[key][f][v]: iNumList.append(self.featuresProbablity[key][f][v]) conditionPr=1 foriNuminiNumList: conditionPr*=iNum resultDict[key]=value*conditionPr #对比每个tag的条件概率的大小 resultList=sorted(resultDict.items(),key=lambdax:x[1],reverse=True) returnresultList[0][0] if__name__=='__main__': trainSet=[ ({"症状":"打喷嚏","职业":"护士"},"感冒"), ({"症状":"打喷嚏","职业":"农夫"},"过敏"), ({"症状":"头痛","职业":"建筑工人"},"脑震荡"), ({"症状":"头痛","职业":"建筑工人"},"感冒"), ({"症状":"打喷嚏","职业":"教师"},"感冒"), ({"症状":"头痛","职业":"教师"},"脑震荡"), ] monitor=NBClassify() #trainSetissomethinglikethat[(featureDict,tag),] monitor.train(trainSet) #打喷嚏的建筑工人 #请问他患上感冒的概率有多大? result=monitor.classify({"症状":"打喷嚏","职业":"建筑工人"}) print(result)
另:关于朴素贝叶斯算法详细说明还可参看本站前面一篇https://www.nhooo.com/article/129903.htm。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。