import pandas as pd
import numpy as np
# 定义写key的函数,比如产生 'X1=3|Y=1'deftokey(col_name, category, y):return col_name +"="+str(category)+"|Y="+str(y)# 去读数据
df = pd.read_csv("../datas/bayes_lihang.txt")# 拉普拉斯 平滑因子
lam =1# 用于存储所有概率的字典
P ={}# 获取类别种类的list
Y = df["Y"].value_counts().keys()# 获取特征列名
col_names = df.columns.tolist()[:-1]# 遍历每个类别for y in Y:# 获取每个类别下的DF
df2 = df[df["Y"]== y]# 计算先验概率
p =(df2.shape[0]+ lam)/(df.shape[0]+len(Y)* lam)# 将先验概率加入P
P[y]= p
# 遍历每个特征 for col_name in col_names:# 获取每个特征下特征值种类的list
categorys = df2[col_name].value_counts().keys()# 遍历每个特征值 for category in categorys:# 计算在某类别下,特征=某特征的条件概率
p =(df2[df2[col_name]== category].shape[0]+ lam)/(
df2.shape[0]+len(categorys)* lam)# 将条件概率加到P
P[tokey(col_name, category, y)]= p
print(P)# 待测数据
X =[2,"S"]# 用于存储属于某一类别的后验概率
res =[]# 遍历类别for y in Y:# 获取先验概率
p = P[y]# 遍历特征 for i inrange(len(X)):# 获取条件概率
p *= P[tokey(col_names[i], X[i], y)]print(p)# 将后验概率加入res
res.append(p)# 返回最大的后验概率对应的类别print(Y[np.argmax(res)])