贝叶斯分类器

来源:互联网 发布:花千骨手游刷勾玉软件 编辑:程序博客网 时间:2024/05/03 11:48

贝叶斯分类器



以下代码是周志华《机器学习》P151关于朴素贝叶斯分类器的实现:

import numpy as npDataSet = [['青绿','蜷缩','浊响','清晰','凹陷','硬滑',0.697,0.460,'好瓜'],           ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑',0.774,0.376, '好瓜'],           ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑',0.634,0.264, '好瓜'],            ['青绿','蜷缩','沉闷','清晰','凹陷','硬滑',0.608,0.318,'好瓜'],            ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑',0.556,0.215, '好瓜'],            ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘',0.403,0.237,'好瓜'],            ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘',0.481,0.149,'好瓜'],            ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑',0.437,0.211,'好瓜'],           ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑',0.666,0.091, '坏瓜'],            ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘',0.243,0.267, '坏瓜'],           ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', 0.245,0.057,'坏瓜'],           ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘',0.343,0.099, '坏瓜'],           ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑',0.639,0.161, '坏瓜'],            ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑',0.657,0.198, '坏瓜'],            ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘',0.360,0.370, '坏瓜'],            ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑',0.593,0.042, '坏瓜'],            ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.719,0.103,'坏瓜']]AttrSet=['色泽','根蒂','敲声','纹理','脐部','触感','密度','含糖率','类别']TestSet=['青绿','蜷缩','浊响', '清晰','凹陷', '硬滑',0.697,0.460]LabelList=[]for Sam in DataSet:    if Sam[-1] in LabelList:        continue    LabelList.extend([Sam[-1]])LabelNum=len(LabelList)# 不同类别的先验概率ProLabel=np.zeros(LabelNum)for Sam in DataSet:    for m in range(LabelNum):        if Sam[-1]==LabelList[m]:            ProLabel[m] +=1.0/len(DataSet)# 在各属性上,不同分类结果条件下,测试样本属性值的条件概率/密度for m in range(len(TestSet)):    # 每个属性    if type(TestSet[m])==type('a'):        # 不同的分类结果条件下的概率        for n in range(LabelNum):            # 遍历训练集            Count = 0            Total = 0            for Sam in DataSet:                if Sam[-1]==LabelList[n]:                    Total +=1.0                    if Sam[m]==TestSet[m]:                        Count +=1.0            # 计算概率            ProLabel[n] *= Count/Total    else:        # 不同分类结果条件下的概率密度(假定服从高斯分布)        for n in range(LabelNum):            # 求均值            Total = 0            U =0            for Sam in DataSet:                if Sam[-1]==LabelList[n]:                    Total +=1.0                    U += Sam[m]            U /=Total            # 求方差            Segma =0            for Sam in DataSet:                if Sam[-1]==LabelList[n]:                    Segma += (Sam[m]-U)**2            Segma /=Total            # 计算概率密度            ProLabel[n] *= 1.0/np.sqrt(2*np.pi)/np.sqrt(Segma)*np.exp(-(TestSet[m]-U)**2/2/Segma)for m in range(LabelNum):    print('\n','样本在类别',LabelList[m],'上的联合概率为:',ProLabel[m],'\n')ProLabel=list(ProLabel)print('\n','判断样本的类别是',LabelList[ProLabel.index(max(ProLabel))],'\n')

原创粉丝点击