《机器学习实战》NaiveBayes算法原理及实现

一、问题描述

鸢尾花(IRIS)有很多种,但又因为特征很是相近,不好区分,通过大量数据归纳的特征,我们通过花萼长度(Sepal.Length),花萼宽度(Sepal.Width),花瓣长度(Petal.Length),花瓣宽度(Petal.Width),4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类,从而更加有效地进行区分。

二、算法原理

朴素贝叶斯最核心的部分是贝叶斯法则,而贝叶斯法则的基石是条件概率。

Bayesianinferenc(贝叶斯推断):根据一个已发生事件的概率,计算另一个事件的发生概率,在可以选择分类中概率最大的就是该事件的分类。

三、数据描述及可视化


横坐标:花萼长度(Sepal.Length)

纵坐标:花萼宽度(Sepal.Width)

横坐标:花瓣长度(Petal.Length)

纵坐标:花瓣宽度(Petal.Width)

四、算法的程序实现

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones() 
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)          #change to log()
    p0Vect = log(p0Num/p0Denom)          #change to log()

    return p0Vect,p1Vect,pAbusive

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0

五、测试结果及分析

选取50%、60%、70%、80%的数据做测试集,绘制正确率折线图,对比1、2两种算法的正确率

测试数据比例           正确率                  错误率

10%                       1.000000               0

20%                       1.000000               0

30%                       0.936170               0.063830

40%                       0.966102               0.033898

50%                       0.957447               0.042553

60%                      0.920000               0.080000

70%                       0.950000              0.065217

80%                       0.933333               0.066667

90%                       0.330827               0.669173

在测试数据量到80%之前算法分类出错的概率都非常低,80%之后错误率有明显提高。

六、总结与体会

模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响.

七、参考文献

【1】朴素贝叶斯分类器(NaiveBayes Classifiers)https://blog.csdn.net/sinat_36246371/article/details/60140664

【2】Peter Harrington。《机器学习实战》

【3】python使用matplotlib绘制柱状图教程

http://www.jb51.net/article/104924.htm

非常感谢阅读!如有不足之处,请留下您的评价和问题




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值