这次需要总结的是朴素贝叶斯算法,参考文章:

  • 《统计学习方法》
  • 机器学习常见算法个人总结(面试用)
  • 朴素贝叶斯理论推导与三种常见模型
  • 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利

简介

朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法。

贝叶斯定理是基于条件概率来计算的,条件概率是在已知事件B发生的前提下,求解事件A发生的概率,即P(A|B)=P(AB)P(B)P(A|B)=\frac{P(AB)}{P(B)},而贝叶斯定理则可以通过P(A|B)P(A|B)来求解P(B|A)P(B|A):

P(B|A)=P(A|B)P(B)P(A)

P(B|A) = \frac{P(A|B)P(B)}{P(A)}
其中分母 P(A)P(A)可以根据全概率公式分解为: P(A)=∑ni=1P(Bi)P(A|Bi)P(A)=\sum_{i=1}^n P(B_i)P(A|B_i)

特征条件独立假设是指假设各个维度的特征x1,x2,...,xnx_1,x_2,...,x_n互相独立,则条件概率可以转化为:

P(x|yk)=P(x1,x2,...,xn|yk)=∏i=1nP(xi|yk)

P(x|y_{k})=P(x_{1},x_{2},...,x_{n}|y_{k})=\prod_{i=1}^{n}P(x_{i}|y_{k})
朴素贝叶斯分类器可表示为:

f(x)=argmaxykP(yk|x)=argmaxykP(yk)∏ni=1P(xi|yk)∑kP(yk)∏ni=1P(xi|yk)

f(x)=argmax_{y_{k}} P(y_{k}|x)=argmax_{y_{k}} \frac{P(y_{k})\prod_{i=1}^{n}P(x_{i}|y_{k})}{\sum_{k}P(y_{k})\prod_{i=1}^{n}P(x_{i}|y_{k})}
而由于对上述公式中分母的值都是一样的,所以可以忽略分母部分,即可以表示为:

f(x)=argmaxP(yk)∏i=1nP(xi|yk)

f(x)=argmax P(y_{k})\prod_{i=1}^{n}P(x_{i}|y_{k})
这里 P(yk)P(y_k)是先验概率,而 P(yk|x)P(y_k|x)则是后验概率,朴素贝叶斯的目标就是最大化后验概率,这等价于期望风险最小化。

参数估计

极大似然估计

朴素贝叶斯的学习意味着估计P(yk)P(y_k)和P(xi|yk)P(x_i|y_k),可以通过极大似然估计来估计相应的概率。

如上图所示,分别是P(yk)P(y_k)和P(xi|yk)P(x_i|y_k)的极大似然估计。

当求解完上述两个概率,就可以对测试样本使用朴素贝叶斯分类算法来预测其所属于的类别,简单总结的算法流程如下所示:

贝叶斯估计/多项式模型

极大似然估计可能会出现所要估计的概率值为0的情况,这会影响到后验概率的计算,使分类产生偏差。解决这个问题的办法是使用贝叶斯估计,也被称为多项式模型。

特征是离散的时候,使用多项式模型。多项式模型在计算先验概率P(yk)P(y_k)和条件概率P(xi|yk)P(x_i|y_k)时,会做一些平滑处理,具体公式为:

P(yk)=Nyk+αN+kα

P(y_k)=\frac{N_{y_k}+α}{N+kα}

NN是总的样本个数,kk是总的类别个数,NykN_{y_k}是类别为yky_k的样本个数,αα是平滑值。

P(xi|yk)=Nyk,xi+αNyk+nα

P(x_i|y_k) = \frac{N_{y_k,x_i} + \alpha}{N_{y_k}+n\alpha}

NykN_{y_k}是类别为yky_k的样本个数,nn是特征的维数,Nyk,xiN_{y_k,x_i}是类别为yky_k的样本中,第ii维特征的值是xix_i的样本个数,αα是平滑值。

当α=1α=1时,称作Laplace平滑,当0<α<10时,称作Lidstone平滑,α=0时不做平滑。

如果不做平滑,当某一维特征的值xix_i没在训练样本中出现过时,会导致P(xi|yk)=0P(x_i|y_k)=0,从而导致后验概率为0。加上平滑就可以克服这个问题。

高斯模型

当特征是连续变量的时候,运用多项式模型会导致很多P(xi|yk)=0P(x_i|y_k) = 0(不做平滑的情况下),即使做平滑,所得到的条件概率也难以描述真实情况,所以处理连续变量,应该采用高斯模型。

高斯模型是假设每一维特征都服从高斯分布(正态分布):

P(xi|yk)=12πσ2yk−−−−−√exp(−(xi−μyk)22σ2yk)

P(x_{i}|y_{k}) = \frac{1}{\sqrt{2\pi\sigma_{y_{k}}^{2}}}exp( -\frac{(x_{i}-\mu_{y_{k}})^2} {2\sigma_{y_{k}}^{2}} )
μyk,i\mu_{y_{k},i}表示类别为yky_k的样本中,第ii维特征的均值;
σ2yk,i\sigma_{y_{k},i}^{2}表示类别为yky_k的样本中,第ii维特征的方差。

伯努利模型

与多项式模型一样,伯努利模型适用于离散特征的情况,所不同的是,伯努利模型中每个特征的取值只能是1和0(以文本分类为例,某个单词在文档中出现过,则其特征值为1,否则为0).

伯努利模型中,条件概率P(xi|yk)P(x_i|y_k)的计算方式是:

当特征值xix_i为1时,P(xi|yk)=P(xi=1|yk)P(x_i|y_k)=P(x_i=1|y_k);

当特征值xix_i为0时,P(xi|yk)=1−P(xi=1|yk)P(x_i|y_k)=1−P(x_i=1|y_k);

工作流程

  1. 准备阶段
    确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本。
  2. 训练阶段
    计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计
  3. 应用阶段
    使用分类器进行分类,输入是分类器和待分类样本,输出是样本属于的分类类别

属性特征

  1. 特征为离散值时直接统计即可(表示统计概率)
  2. 特征为连续值的时候假定特征符合高斯分布,则有
P(xi|yk)=12πσ2yk−−−−−√exp(−(xi−μyk)22σ2yk)

P(x_{i}|y_{k}) = \frac{1}{\sqrt{2\pi\sigma_{y_{k}}^{2}}}exp( -\frac{(x_{i}-\mu_{y_{k}})^2} {2\sigma_{y_{k}}^{2}} )

优缺点

优点

  1. 对小规模的数据表现很好,适合多分类任务,适合增量式训练。

缺点

  1. 对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。

代码实现

下面是使用sklearn的代码例子,分别实现上述三种模型,例子来自朴素贝叶斯的三个常用模型:高斯、多项式、伯努利。
下面是高斯模型的实现

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> iris.feature_names  # 四个特征的名字
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
>>> iris.data
array([[ 5.1,  3.5,  1.4,  0.2],[ 4.9,  3. ,  1.4,  0.2],[ 4.7,  3.2,  1.3,  0.2],[ 4.6,  3.1,  1.5,  0.2],[ 5. ,  3.6,  1.4,  0.2],[ 5.4,  3.9,  1.7,  0.4],[ 4.6,  3.4,  1.4,  0.3],[ 5. ,  3.4,  1.5,  0.2],......[ 6.5,  3. ,  5.2,  2. ],[ 6.2,  3.4,  5.4,  2.3],[ 5.9,  3. ,  5.1,  1.8]]) #类型是numpy.array
>>> iris.data.size
600  #共600/4=150个样本
>>> iris.target_names
array(['setosa', 'versicolor', 'virginica'], dtype='|S10')
>>> iris.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,....., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ......, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
>>> iris.target.size
150
>>> from sklearn.naive_bayes import GaussianNB
>>> clf = GaussianNB()
>>> clf.fit(iris.data, iris.target)
>>> clf.predict(iris.data[0])
array([0])   # 预测正确
>>> clf.predict(iris.data[149])
array([2])   # 预测正确
>>> data = numpy.array([6,4,6,2])
>>> clf.predict(data)
array([2])  # 预测结果很合理

多项式模型如下:

>>> import numpy as np
>>> X = np.random.randint(5, size=(6, 100))
>>> y = np.array([1, 2, 3, 4, 5, 6])
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2]))
[3]

值得注意的是,多项式模型在训练一个数据集结束后可以继续训练其他数据集而无需将两个数据集放在一起进行训练。在sklearn中,MultinomialNB()类的partial_fit()方法可以进行这种训练。这种方式特别适合于训练集大到内存无法一次性放入的情况。

在第一次调用partial_fit()时需要给出所有的分类标号。

>>> import numpy
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb'])
GaussianNB()
>>> clf.partial_fit(numpy.array([6,1]), numpy.array(['bb']))
GaussianNB()
>>> clf.predict(numpy.array([9,1]))
array(['bb'], dtype='|S2')

伯努利模型如下:

>>> import numpy as np
>>> X = np.random.randint(2, size=(6, 100))
>>> Y = np.array([1, 2, 3, 4, 4, 5])
>>> from sklearn.naive_bayes import BernoulliNB
>>> clf = BernoulliNB()
>>> clf.fit(X, Y)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2]))
[3]

朴素贝叶斯的总结就到这里为止。

机器学习算法总结--朴素贝叶斯相关推荐

  1. 机器学习算法基础——朴素贝叶斯算法

    26.朴素贝叶斯算法原理 联合概率和条件概率 联合概率:包含多个条件,且所有条件同时成立的概率 记作:P(A,B) P(A,B)=P(A)P(B) 条件概率:就是事件A在另外一个事件B已经发生条件下的 ...

  2. 机器学习算法之朴素贝叶斯模型

    基本原理 从统计学知识回到我们的数据分析.假如我们的分类模型样本是: 即我们有m个样本,每个样本有n个特征,特征输出有k个类别,定义为C1,C2,-,Ck,.从样本我们可以学习得到朴素贝叶斯的先验分布 ...

  3. 朴素贝叶斯基础【机器学习算法一朴素贝叶斯1】

    基础知识回顾 (上述内容引自李航<统计学习方法>) 过去的7天当中,有3天下雨,4天没有下雨.用0代表灭有下雨,而1代表下雨,我们可以用一个数组来表示: y=[0,1,1,0,1,0,0] ...

  4. 朴素贝叶斯实例(肿瘤良性与恶性)【机器学习算法一朴素贝叶斯5】

    import matplotlib.pyplot as plt import numpy as np#导入肿瘤数据集 from sklearn.datasets import load_breast_ ...

  5. 伯努利朴素贝叶斯【机器学习算法一朴素贝叶斯2】

    伯努利朴素贝叶斯方法适合于伯努利分布(即二项分布或0-1分布)的数据集. import numpy as np from sklearn.naive_bayes import BernoulliNB ...

  6. 机器学习实验:朴素贝叶斯算法

    机器学习实验:朴素贝叶斯算法 问题如下: 根据给出的算法naivebayes.py,实现: 1.将数据集文件naivebayes_data.csv中的数据替换成14天打球与天气数据: 2.预测样本{O ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法12:贝叶斯网络

    Python机器学习算法实现 Author:louwill 在上一讲中,我们讲到了经典的朴素贝叶斯算法.朴素贝叶斯的一大特点就是特征的条件独立假设,但在现实情况下,条件独立这个假设通常过于严格,在实际 ...

  8. 《机器学习实战》朴素贝叶斯

    机器学习实战的朴素贝叶斯一章中的源文件老是提示 IndexError: range object index out of range 看源码里怎么都不会溢出啊,除非minLen为0:所以看了下测试集 ...

  9. 实现贝叶斯分类器_机器学习实战项目-朴素贝叶斯

    朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们通过实例来讨论贝叶斯分类的中最简单的一种: ...

最新文章

  1. PYTHON1.day01
  2. China Linux Kernel-ppt
  3. 【LeetCode】620. 有趣的电影
  4. python性能测试方法_Python实现测试磁盘性能的方法
  5. P4071-[SDOI2016]排列计数【组合计数,错排】
  6. java chsftp.get 追加_Java SFTP上传使用JSch,但如何覆盖当前文件?
  7. 常见的技术类英文字母含义总结,Localhost、SDK、URL 等(持续更新中)
  8. git没有冲突 但是提示有_git 代码冲突处理
  9. Linux能ping主机,但ping不了网关以及外网,显示包全丢失解决方案
  10. 图像处理形态学椭圆形模板结构元素的设计与实现
  11. 海量数据的常用10大解决方案
  12. 受力分析软件_大赛作品 | 关于Z型路灯受力情况分析
  13. eXtremeComponents 使用总结
  14. java中jre_java中的jre是什么?
  15. tbschedule 前后置处理器、定期执行任务
  16. Casbin访问控制框架入门详解及Java案例示范
  17. fflush php,php fflush()函数使用实例分析
  18. MySQL数据库(一)服务器数据库的搭建和远程访问
  19. Qt下绘制PPI扫描的雷达图
  20. 第一章:ORM框架发展历程和MyBatis的核心应用

热门文章

  1. python class tynu()_Visual Studio Express | Teraz Visual Studio Community
  2. C语言 用链表对学号进行排序,求解C语言中建立一个对链表按照学号进行排序的问题...
  3. js遍历Object所有属性
  4. MSP430F5529 DriverLib 库函数学习笔记(九)SPI
  5. Workbox.strategies v3.x 中文版
  6. VIM自动格式化C代码
  7. bootstrap .navbar-header 控制button隐藏/显示
  8. register_sysctl_table实现内核数据交互
  9. 前端学习(3048):vue+element今日头条管理-展示文章列表
  10. 前端学习(3027):vue+element今日头条管理-关于图标的处理