Python 西瓜书 拉普拉斯修正的朴素贝叶斯分类器(可以直接运行)

根据西瓜书的西瓜数据集3.0,实现拉普拉斯修正的朴素贝叶斯分类器。

# -*- coding: utf-8 -*-
import pandas as pd
import math

##朴素贝叶斯分类器
def fun(sigma,mu,xi):#概率密度函数
    return 1/(math.sqrt(2*math.pi)*sigma)*math.exp(-(xi-mu)**2/(2*sigma**2))

def Naive_Bayers_Classifier(data,pred_data,c):
##data:数据集
##pred_data:予测分类
##c:分类名称
##采用拉普拉斯修正
    features_list = pred_data.keys()
    
    ##计算先验概率,Smoothing
    c_num = data[c].value_counts().values.tolist()
    c_name = data[c].value_counts().index.tolist()
    p_c_list = []
    for i in range(len(c_num)):
        p_c_list.append((c_num[i]+1)/(data.shape[0]+len(c_num)))
        
    ##每个属性估计条件概率
    die_data = data.groupby(c)
    p_y_list = []
    
    for i in range(len(p_c_list)):
        data1 = die_data.get_group(c_name[i])
        
        p_f_list = [] #条件概率P(x_i|c)
        for feature in features_list:
            if data1[feature].dtype==object:      
                f_num = data1[data1[feature]==pred_data[feature]].shape[0]
                p_f_list.append((f_num+1)/(data1.shape[0]+len(data1[feature].value_counts().index.tolist())))
            else:
                sigma = data1[feature].std()
                mu = data1[feature].mean()
                p_f_list.append(fun(sigma,mu,pred_data[feature]))
        mul = 1        
        for p_f in p_f_list:
            mul *= p_f  #P(x|c)
        mul *= p_c_list[i]
        print(str(c)+' '+c_name[i]+'的概率:',mul)
        p_y_list.append(mul)
    
    idmax = p_y_list.index(max(p_y_list))
    print('结论:'+str(c)+' '+c_name[idmax])


data = pd.read_table('watermelon30.txt',delimiter=',')                
##予测:
pred_data = {'色泽':'青绿','根蒂':'蜷缩','敲声':'清脆','纹理':'清晰','脐部':'凹陷','触感':'硬滑',
             '密度':0.697,'含糖率':0.460}

c = '好瓜'

Naive_Bayers_Classifier(data,pred_data,c)

    


发布了10 篇原创文章 · 获赞 9 · 访问量 586

猜你喜欢

转载自blog.csdn.net/qq_36937684/article/details/105127027