机器学习算法之朴素贝叶斯算法(python实现)

        朴素贝叶斯算法(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 '预测结果为:不会下雨')  

        代码运行结果如下:

 

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值