朴素贝叶斯算法(Naive Bayes,NB)是一种基于贝叶斯定理的分类算法,该算法认为样本属性之间相互独立,在文本分类、垃圾邮件过滤、情感分析等领域都有广泛的应用。朴素贝叶斯算法的基本思想是利用训练数据集中已知的类别信息,学习每个类别下各个属性出现的概率分布情况,然后利用贝叶斯公式计算待分类数据属于各个类别的概率,选择概率最大的类别作为预测结果。具体来说,对于一个待分类的样本x,它属于类别Cj的后验概率可以表示为:
P(Cj|x) = P(x|Cj) * P(Cj) / P(x)
对于每一个P(Cj|x)来说,它的P(x)都相等,因此在代码中我直接比较P(x|Cj) * P(Cj)的大小来实现贝叶斯算法。本次算法代码中我选用的数据集为在某十天中是否下雨,共10条数据。
具体python代码如下:
from numpy import *
x = array([
[0, 1, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 0],
[0, 1, 1, 0],
[0, 1, 0, 0],
[0, 1, 0, 1],
[1, 1, 0, 1],
[1, 0, 0, 1],
[1, 1, 0, 1],
[0, 0, 0, 0]
])
y = array([1, 1, 1, 1, 0, 1, 0, 0, 1, 0])
yes = 0
no = 0
for i in y:
if i == 1: #统计下雨的天数
yes += 1
else: #统计不下雨的天数
no += 1
p_yes = yes / len(y) #计算 P(下雨)
p_no = no / len(y) #计算 P(不下雨)
yes_hasWind = 0
yes_isHumid = 0
yes_isCloudy = 0
yes_isHot = 0
for i in range(0,len(x)):
if x[i][0] == 1 and y[i] == 1: #统计下雨且有风的天数
yes_hasWind += 1
if x[i][1] == 1 and y[i] == 1: #统计下雨且潮湿的天数
yes_isHumid += 1
if x[i][2] == 1 and y[i] == 1: #统计下雨且多云的天数
yes_isCloudy += 1
if x[i][3] == 1 and y[i] == 1: #统计下雨且闷热的天数
yes_isHot += 1
#使用拉普拉斯技巧,在每个关键词上面人为增加一个出现的次数以保证每一项都不为0
yes_hasWind += 1
yes_isHumid += 1
yes_isCloudy += 1
yes_isHot += 1
no_hasWind = 0
no_isHumid = 0
no_isCloudy = 0
no_isHot = 0
for i in range(0,len(x)):
if x[i][0] == 1 and y[i] == 0: #统计不下雨且有风的天数
no_hasWind += 1
if x[i][1] == 1 and y[i] == 0: #统计不下雨且潮湿的天数
no_isHumid += 1
if x[i][2] == 1 and y[i] == 0: #统计不下雨且多云的天数
no_isCloudy += 1
if x[i][3] == 1 and y[i] == 0: #统计不下雨且闷热的天数
no_isHot += 1
#使用拉普拉斯技巧
no_hasWind += 1
no_isHumid += 1
no_isCloudy += 1
no_isHot += 1
entire_1 = yes_hasWind+yes_isHumid+yes_isCloudy+yes_isHot
entire_2 = no_hasWind+no_isHumid+no_isCloudy+no_isHot
p_yes_every = []
p_yes_every.append(yes_hasWind / entire_1) #计算 P(有风|下雨)
p_yes_every.append(yes_isHumid / entire_1) #计算 P(潮湿|下雨)
p_yes_every.append(yes_isCloudy / entire_1) #计算 P(多云|下雨)
p_yes_every.append(yes_isHot / entire_1) #计算 P(闷热|下雨)
p_no_every = []
p_no_every.append(no_hasWind / entire_2) #计算 P(有风|不下雨)
p_no_every.append(no_isHumid / entire_2) #计算 P(潮湿|不下雨)
p_no_every.append(no_isCloudy / entire_2) #计算 P(多云|不下雨)
p_no_every.append(no_isHot / entire_2) #计算 P(闷热|不下雨)
forecast = [] #用forecast列表接收用户输入的数据
forecast.append(int(input('是否有风:')))
forecast.append(int(input('是否潮湿:')))
forecast.append(int(input('是否多云:')))
forecast.append(int(input('是否闷热:')))
p1 = p_yes
p2 = p_no
for i in range(0,len(forecast)):
if forecast[i] == 1:
p1 *= p_yes_every[i] #根据贝叶斯公式计算最终会下雨的概率
p2 *= p_no_every[i] #根据贝叶斯公示计算最终不会下的概率
print('会下雨的概率=',end=str(p1)+'\n')
print('不会下雨的概率=',end=str(p2)+'\n')
print('预测结果为:会下雨' if p1 > p2 else '预测结果为:不会下雨')
代码运行结果如下: