在学习用朴素贝叶斯模型做文本分类的时候, 发现朴素贝叶斯是基于三个常用的模型, 高斯, 多项式, 和伯努利,所以查资料发现了一篇比较好的博客解释着三个模型的原理和区别。 所以转载一下:
原文出处:https://blog.csdn.net/qq_27009517/article/details/80044431

在文本分类中,假设我们有一个文档d∈Xd∈Xd∈X,XXX是文档向量空间(document space),和一个固定的类集合C=c1,c2,…,cjC={c1,c2,…,cj}C=c1,c2,…,cj,类别又称为标签。显然,文档向量空间是一个高维度空间。我们把一堆打了标签的文档集合<d,c><d,c><d,c>作为训练样本,<d,c>∈X×C<d,c>∈X×C<d,c>∈X×C。例如:

<d,c>={Beijing joins the World Trade Organization, China}

对于这个只有一句话的文档,我们把它归类到 China,即打上china标签。

我们期望用某种训练算法,训练出一个函数γ,能够将文档映射到某一个类别:γ:X→Cγ:X→Cγ:X→C

这种类型的学习方法叫做有监督学习,因为事先有一个监督者(我们事先给出了一堆打好标签的文档)像个老师一样监督着整个学习过程。

朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)和伯努利模型(Bernoulli model)。

1. 多项式模型

在多项式模型中, 设某文档d=(t1,t2,…,tk)d=(t_1,t_2,…,t_k)d=(t1​,t2​,…,tk​),tkt_ktk​是该文档中出现过的单词,允许重复,则

  • 先验概率P(c)=类c下单词总数/整个训练样本的单词总数P(c)= 类c下单词总数/整个训练样本的单词总数P(c)=类c下单词总数/整个训练样本的单词总数

  • 类条件概率P(tk∣c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+∣V∣)P(tk|c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)P(tk∣c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+∣V∣)

VVV是训练样本的单词表(即抽取单词,单词出现多次,只算一个),∣V∣|V|∣V∣则表示训练样本包含多少种单词。在这里,m=∣V∣,p=1/∣V∣m=|V|, p=1/|V|m=∣V∣,p=1/∣V∣。

P(tk∣c)P(t_k|c)P(tk​∣c)可以看作是单词tkt_ktk​在证明ddd属于类ccc上提供了多大的证据,而P(c)P(c)P(c)则可以认为是类别c在整体上占多大比例(有多大可能性)。

给定一组分类好了的文本训练数据,如下:

给定一个新样本Chinese Chinese Chinese Tokyo Japan,对其进行分类。

该文本用属性向量表示为d=(Chinese, Chinese, Chinese, Tokyo, Japan),类别集合为Y={yes, no}

类yes下总共有8个单词,类no下总共有3个单词,训练样本单词总数为11,因此P(yes)=8/11, P(no)=3/11。类条件概率计算如下:

P(Chinese | yes)=(5+1)/(8+6)=6/14=3/7
//类yes下单词Chinese在各个文档中出现过的次数之和+1/类yes下单词的总数(8)+总训练样本的不重复单词(6)P(Japan | yes)=P(Tokyo | yes)= (0+1)/(8+6)=1/14P(Chinese|no)=(1+1)/(3+6)=2/9P(Japan|no)=P(Tokyo| no) =(1+1)/(3+6)=2/9

分母中的8,是指yes类别下textc的长度,也即训练样本的单词总数,6是指训练样本有Chinese,Beijing,Shanghai, Macao, Tokyo, Japan 共6个单词,3是指no类下共有3个单词。

有了以上类条件概率,开始计算后验概率,

P(yes | d)=(3/7)3×1/14×1/14×8/11=108/184877≈0.00029209
//Chinese Chinese Chinese Tokyo JapanP(no | d)= (2/9)3×2/9×2/9×3/11=32/216513≈0.00014780

因此,这个文档属于类别china

2. 伯努利模型

P(c)=类c下文件总数/整个训练样本的文件总数P(c)= 类c下文件总数/整个训练样本的文件总数P(c)=类c下文件总数/整个训练样本的文件总数

P(tk∣c)=(类c下包含单词tk的文件数+1)/(类c的文档总数+2)P(t_k|c)=(类c下包含单词tk的文件数+1)/(类c的文档总数+2)P(tk​∣c)=(类c下包含单词tk的文件数+1)/(类c的文档总数+2)

在这里,m=2,p=1/2m=2, p=1/2m=2,p=1/2。

还是使用前面例子中的数据。

类yes下总共有3个文件,类no下有1个文件,训练样本文件总数4,因此

P(yes)=3/4, P(Chinese | yes)=(3+1)/(3+2)=4/5P(Japan | yes)=P(Tokyo | yes)=(0+1)/(3+2)=1/5P(Beijing | yes)= P(Macao|yes)= P(Shanghai |yes)=(1+1)/(3+2)=2/5P(Chinese|no)=(1+1)/(1+2)=2/3P(Japan|no)=P(Tokyo| no) =(1+1)/(1+2)=2/3P(Beijing| no)= P(Macao| no)= P(Shanghai | no)=(0+1)/(1+2)=1/3

有了以上类条件概率,开始计算后验概率,

P(yes | d)=P(yes)×P(Chinese|yes) ×P(Japan|yes) ×P(Tokyo|yes)×(1-P(Beijing|yes)) ×(1-P(Shanghai|yes))×(1-P(Macao|yes))=3/4×4/5×1/5×1/5×(1-2/5) ×(1-2/5)×(1-2/5)=81/15625≈0.005P(no | d)= 1/4×2/3×2/3×2/3×(1-1/3)×(1-1/3)×(1-1/3)=16/729≈0.022

因此,这个文档不属于类别china

3. 两个模型的区别

二者的计算粒度不一样,多项式模型以单词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。

计算后验概率时,对于一个文档ddd,多项式模型中,只有在ddd中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在d中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的。

朴素贝叶斯是一个很不错的分类器,在使用朴素贝叶斯分类器划分邮件有关于朴素贝叶斯的简单介绍。

若一个样本有nnn个特征,分别用表示,将其划分到类的可能性为:

上式中等号右侧的各个值可以通过训练得到。根据上面的公式可以求的某个数据属于各个分类的可能性(这些可能性之和不一定是1),该数据应该属于具有最大可能性的分类中。

一般来说,如果一个样本没有特征,那么将不参与计算。不过下面的伯努利模型除外。

以上是朴素贝叶斯的最基本的内容

4. 代码实现

4.1 高斯模型

有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1;在160cm和170cm之间,特征值为2;在170cm之上,特征值为3。也可以这样转换,将身高转换为3个特征,分别是f1、f2、f3,如果身高是160cm以下,这三个特征的值分别是1、0、0,若身高在170cm之上,这三个特征的值分别是0、0、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])  # 预测结果很合理

4.2 多项式模型

该模型常用于文本分类,特征是单词,值是单词的出现次数。

其中,是类别下特征出现的总次数;是类别下所有特征出现的总次数。对应到文本分类里,如果单词word在一篇分类为label1的文档中出现了5次,那么的值会增加5。如果是去除了重复单词的,那么的值会增加1。是特征的数量,在文本分类中就是去重后的所有单词的数量。的取值范围是[0,1],比较常见的是取值为1。

待预测样本中的特征在训练时可能没有出现,如果没有出现,则值为0,如果直接拿来计算该样本属于某个分类的概率,结果都将是0。在分子中加入,在分母中加入可以解决这个问题。

下面的代码来自sklearn的示例:

>>> 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')

4.3 伯努利模型

伯努利模型中,对于一个样本来说,其特征用的是全局的特征。

在伯努利模型中,每个特征的取值是布尔型的,即true和false,或者1和0。在文本分类中,就是一个特征有没有在一个文档中出现。

如果特征值值为1,那么

如果特征值值为0,那么

这意味着,“没有某个特征”也是一个特征。

下面的示例来自sklearn官方文档:

>>> 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]

BernoulliNB()类也有partial_fit()函数。

5. 多项式模型和伯努利模型在文本分类中的应用

在基于naive bayes的文本分类算法给出了很好的解释。

在多项式模型中:

在多项式模型中, 设某文档d=(t1,t2,…,tk)d=(t_1,t_2,…,t_k)d=(t1​,t2​,…,tk​),tkt_ktk​是该文档中出现过的单词,允许重复,则

  • 先验概率P(c)=类c下单词总数/整个训练样本的单词总数先验概率P(c)= 类c下单词总数/整个训练样本的单词总数先验概率P(c)=类c下单词总数/整个训练样本的单词总数
  • 类条件概率P(tk∣c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+∣V∣)类条件概率P(t_k|c)=(类c下单词t_k在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)类条件概率P(tk​∣c)=(类c下单词tk​在各个文档中出现过的次数之和+1)/(类c下单词总数+∣V∣)

VVV是训练样本的单词表(即抽取单词,单词出现多次,只算一个),∣V∣|V|∣V∣则表示训练样本包含多少种单词。 P(tk∣c)P(t_k|c)P(tk​∣c)可以看作是单词tk在证明d属于类c上提供了多大的证据,而P(c)P(c)P(c)则可以认为是类别ccc在整体上占多大比例(有多大可能性)。

在伯努利模型中:

  • P(c)=类c下文件总数/整个训练样本的文件总数P(c)= 类c下文件总数/整个训练样本的文件总数P(c)=类c下文件总数/整个训练样本的文件总数
  • P(tk∣c)=(类c下包含单词tk的文件数+1)/(类c下单词总数+2)P(t_k|c)=(类c下包含单词t_k的文件数+1)/(类c下单词总数+2)P(tk​∣c)=(类c下包含单词tk​的文件数+1)/(类c下单词总数+2)

原文章感觉排版看起来不是很好, 逻辑也不是很清楚, 后面的还是看原文吧, 这里不转了, 不符合我风格了发现。

朴素贝叶斯的三个常用模型: 高斯、多项、伯努利的原理和解释相关推荐

  1. 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利

    部分内容转自:https://blog.csdn.net/qq_27009517/article/details/80044431 0.朴素贝叶斯 朴素贝叶斯分类(NBC,Naive Bayes Cl ...

  2. 朴素贝叶斯的三个常用模型:高斯(GaussianNB)、多项式(multinomial model)、伯努利(Bernoulli model)

    文本分类 在文本分类中,假设我们有一个文档d∈X,X是文档向量空间(document space),和一个固定的类集合C={c1,c2,-,cj},类别又称为标签.显然,文档向量空间是一个高维度空间. ...

  3. 基于朴素贝叶斯和预训练Bert模型的中文句子情感分类实践

    基于朴素贝叶斯和预训练Bert模型的中文句子情感分类实践 1.任务介绍   本次实践选题为AI研习社2019年9月份举办的中文对话情感分析任务,并在原任务基础上进行了拓展.任务首先给定一中文语句数据集 ...

  4. 从朴素贝叶斯的角度推导logistic模型

    从朴素贝叶斯的角度推导logistic模型 文章结构预览 1.朴素贝叶斯算法的理解 2.logistic模型简介 3.从朴素贝叶斯的角度解释为什么logistic模型的sigmoid函数可以表示概率 ...

  5. python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估(完整代码+实现效果)

    实现功能: python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估. 实现代码: # 导入需要的库 from warnings import simplefilter simplef ...

  6. 朴素贝叶斯.Laplace平滑.多项式事件模型

    <Andrew Ng 机器学习笔记>这一系列文章文章是我再观看Andrew Ng的Stanford公开课之后自己整理的一些笔记,除了整理出课件中的主要知识点,另外还有一些自己对课件内容的理 ...

  7. NB朴素贝叶斯理论推导与三种常见模型

    转自:http://www.tuicool.com/articles/zEJzIbR 朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤). ...

  8. 朴素贝叶斯理论推导与三种常见模型

    朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤).很多教材都从这些案例出发,本文就不重复这些内容了,而把重点放在理论推导(其实很浅显,别 ...

  9. [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)

    一.概率知识点复习 (1)条件概率 就是事件A在另外一个事件B已经发生条件下的发生概率.条件概率表示为P(A|B),读作"在B条件下A的概率". (2)联合概率 可以简单的理解为事 ...

最新文章

  1. druid+spring配置
  2. .NET Core EntityFramework生成自动增长的主键
  3. LeetCode Combinations (组合)
  4. struts2教程(6)--国际化处理
  5. boost::container模块实现虚拟测试分配器的程序
  6. java删除文件模糊_Java实现的模糊匹配某文件夹下的文件并删除功能示例
  7. 跟踪React流–将Spring Cloud Sleuth与Boot 2结合使用
  8. linux 文件的目录,Linux文件及目录管理
  9. linux中匿名用户怎么登陆_Linux网络配置 | FTP 实战-匿名用户登录
  10. 回归分析加不加常数项_时间序列分析基础(一)
  11. js 生成二维码_Node for Max 二维码生成器
  12. java 继承 String类
  13. error: 'Can't connect to local MySQL server through socket '/data/3307/data/mysql.sock' (2)'
  14. 推荐用于BMS锂电池管理系统的低功耗蓝牙芯片MS1656
  15. Unity 编辑器扩展教程
  16. 交通大数据干货总结(1)
  17. The perfect floor chair
  18. Java中的程序计数器
  19. 爱普生打印机无法正常工作的解决方法
  20. 总结 | Prompt在NER场景的应用

热门文章

  1. 计算机二战一个双非学校怎样,双非二战学长成功调剂985:看他的调剂院校选择!...
  2. 安装ao 服务器为空,如何在64位Windows操作系统中安装现场审计实施系统AO2011
  3. 如何提高在搜索引擎中的排名-百度排名-竞价排名-自然排名
  4. Unity WEBGL设置浏览器全屏
  5. 写出Java的第一个程序
  6. 【ict云赛道备考】华为云介绍
  7. Windows查看局域网在线的所有IP
  8. res\values-sw360dp\dimens.xml.orig:518: error:
  9. 奥数计算机竞赛试题,奥数试卷
  10. 2022跨年烟花代码|用Python送你一场跨年烟花秀