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程序设计有所帮助。