机器学习总结(lecture 12)算法:朴素贝叶斯 naive bayes

lecture 12:朴素贝叶斯 naive bayes

目录

参考博客:https://www.cnblogs.com/pinard/p/6069267.html

在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X),要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出。

朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用。

1朴素贝叶斯相关的统计学知识

贝叶斯学派的思想可以概括为先验概率+数据=后验概率。

在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类。

这里写图片描述

2朴素贝叶斯的模型

这里写图片描述
从上式可以看出,这个很难的条件分布大大的简化了,但是这也可能带来预测的不准确性。你会说如果我的特征之间非常不独立怎么办?如果真是非常不独立的话,那就尽量不要使用朴素贝叶斯模型了,考虑使用其他的分类方法比较好。

但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。

  • 虽然我们牺牲了准确性,但是得到的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。

这里写图片描述

3朴素贝叶斯的推断过程

上节我们已经对朴素贝叶斯的模型也预测方法做了一个大概的解释,这里我们对朴素贝叶斯的推断过程做一个完整的诠释过程。
这里写图片描述
接着我们利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:
这里写图片描述

4朴素贝叶斯的参数估计

这里写图片描述
这里写图片描述
这里写图片描述

5总结

朴素贝叶斯没有复杂的求导和矩阵运算,因此效率很高。

朴素贝叶斯的主要优点有:

    1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

    2)对小规模的数据表现很好,能处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

    3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

朴素贝叶斯的主要缺点有:   

    1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

    2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

    3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

    4)对输入数据的表达形式很敏感。

6scikit-learn 朴素贝叶斯类库

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。

  • 其中GaussianNB就是先验为高斯分布的朴素贝叶斯
  • MultinomialNB就是先验为多项式分布的朴素贝叶斯
  • 而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

这三个类适用的分类场景各不相同

  • 一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
  • 如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。
  • 而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
import numpy as np
from sklearn.naive_bayes import GaussianNB
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])

clf = GaussianNB()
#拟合数据
clf.fit(X, Y)

print("==Predict result by predict==")
print(clf.predict([[-0.8, -1]]))

print("==Predict result by predict_proba==")
print(clf.predict_proba([[-0.8, -1]]))

print("==Predict result by predict_log_proba==")
print(clf.predict_log_proba([[-0.8, -1]]))

==Predict result by predict==
[1]
==Predict result by predict_proba==
[[ 9.99999949e-01 5.05653254e-08]]
==Predict result by predict_log_proba==
[[ -5.05653266e-08 -1.67999998e+01]]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值