实验名称:朴素贝叶斯分类与预测
实验内容:1、通过调用库函数sklearn中的naive_bayes 相关方法。 可调用的三种naive_bayes函数:BernoulliNB, GaussianNB和 MultinomialNB,参考代码为:

(1)要求三种方法都要调用一次,并分析如果X中存在0分量,三种函数的运行结果如何,阐述你的实验观察结论;
(2)将购买电脑案例作为样本输入,预测
待分类数据x=
{age=”<=30”,income=”medium”,
student=”yes”,credit_rating=”fair”}的分类结果。
2、以购买电脑案例为样本输入,调用自编的贝叶斯分类方法,预测
待分类数据x=
{age=”<=30”,income=”medium”,
student=”yes”,credit_rating=”fair”}的分类结果。

import math
class NB():
def __init__(self):
self.cla_all_num = 0
self.cla_num = {}
self.cla_tag_num = {}
self.landa = 1 # 拉普拉斯修正值
def train(self, taglist, cla): # 训练,每次插入一条数据
# 插入分类
self.cla_all_num += 1
if cla in self.cla_num: # 是否已存在该分类
self.cla_num[cla] += 1
else:
self.cla_num[cla] = 1
if cla not in self.cla_tag_num:
self.cla_tag_num[cla] = {} # 创建每个分类的标签字典
# 插入标签
tmp_tags = self.cla_tag_num[cla] # 浅拷贝,用作别名
for tag in taglist:
if tag in tmp_tags:
tmp_tags[tag] += 1
else:
tmp_tags[tag] = 1
def P_C(self, cla): # 计算分类 cla 的先验概率
return self.cla_num[cla] / self.cla_all_num
def P_all_C(self): # 计算所有分类的先验概率
tmpdict = {}
for key in self.cla_num.keys():
tmpdict[key] = self.cla_num[key] / self.cla_all_num
return tmpdict
def P_W_C(self, tag, cla): # 计算分类 cla 中标签 tag 的后验概率
tmp_tags = self.cla_tag_num[cla] # 浅拷贝,用作别名
if tag not in self.cla_tag_num[cla]:
return self.landa / (self.cla_num[cla] + len(tmp_tags) * self.landa) # 拉普拉斯修正
return (tmp_tags[tag] + self.landa) / (self.cla_num[cla] + len(tmp_tags) * self.landa)
def test(self, test_tags): # 测试
res = ''
res_P = None
for cla in self.cla_num.keys():
log_P_W_C = 0
for tag in test_tags:
log_P_W_C += math.log(self.P_W_C(tag, cla))
tmp_P = log_P_W_C + math.log(self.P_C(cla)) # P(w|Ci) * P(Ci)
if res_P is None:
res = cla
res_P = tmp_P
if tmp_P > res_P:
res = cla
res_P = tmp_P
return res
def set_landa(self, landa):
self.landa = landa
def clear(self): # 重置模型
self.cla_all_num = 0
self.cla_num.clear()
self.cla_tag_num.clear()
if __name__ == '__main__':
nb = NB() # 生成模型
# 训练模型
# 年龄,收入,是否学生,信用等级 ---> 是否买了电脑
nb.train(['1', '3', '0', '0'], '0')
nb.train(['1', '3', '0', '1'], '0')
nb.train(['1', '3', '0', '0'], '1')
nb.train(['3', '2', '0', '0'], '1')
nb.train(['3', '1', '1', '0'], '1')
nb.train(['3', '1', '1', '1'], '0')
nb.train(['2', '1', '1', '1'], '1')
nb.train(['1', '2', '0', '0'], '0')
# nb.train(['1', '1', '1', '0'], '1')
# nb.train(['3', '2', '1', '0'], '1')
# nb.train(['1', '2', '1', '1'], '1')
# nb.train(['2', '2', '0', '1'], '1')
nb.train(['2', '3', '1', '0'], '1')
nb.train(['3', '2', '0', '1'], '0')
testdata = ['1', '2', '1', '0']
print('测试结果:', nb.test(testdata))

