跟着博主的脚步,每天进步一点点

本文介绍了朴素贝叶斯模型,朴素贝叶斯(几乎所有的概率模型)的核心假设:特征之间的条件概率相互独立。以垃圾邮件分类问题为例,分析了朴素贝叶斯模型的两种应用场景:1)先验分布和条件概率分布都为一元伯努利分布,2)先验分布为一元伯努利分布,条件概率分布为多元伯努利分布。分别对应词袋子表示中两种常用的方法: one-hot表示,编号表示(词频表示)。

作者 | 文杰

编辑 | yuquanle

朴素贝叶斯

A、朴素贝叶斯

朴素贝叶斯模型也是一个典型的生成模型,一般用来处理离散值数据(伯努利分布导致)。其核心假设是特征之间的条件概率是相互独立的。同样由贝叶斯公式有:

下面以垃圾邮件分类介绍两类问题的朴素贝叶斯模型:

垃圾邮件分类任务是一个基本文本分类任务,涉及到NLP的初步知识-文本的One-hot表示。由于机器学习模型通常是一个数学模型,而非数值型属性是不能直接处理,所以一般对邮件的特征进行编码。首先将所有的邮件中出现的词统计出来作为一个词典,并对每一个词进行编码向量化(即词序)。一封邮件对应的One-hot表示如下:




















































其中




表示第




封邮件,



























表示词典中的第




个词,如果第




个词在第




封邮件中出现则
















,反之为




。可以看出这种表示忽略了文本的大量信息,上下文信息,词出现的次数等。

由上面的公式有,一封邮件是垃圾邮件的概率可以表示为下式:

其中似然函数











为在垃圾邮件下产生




的条件概率,









为垃圾邮件的先验概率,


















对于所有样本都是一致,近似忽略。

由朴素贝叶斯的条件概率独立性假设有条件概率如下:

其中




表示第




个特征。所以,对于一封邮件属于哪一类的概率为都有:

邮件之间独立,所以目标函数最大化所有邮件属于各自类的概率为:

从上式可以看出朴素贝叶斯的参数是




















,












,即所有邮件类别的先验,以及在某一类下出现某个词的概率。由极大似然估计参数值即为其期望。

其中




表示类别,对应垃圾邮件分类取值为



(





),







表示第




个特征,




表示特征的取值。由于垃圾邮件中采用one-hot编码,所以









的取值为



(





)







表示出现。当以上参数确定之后,对于一封新的邮件,根据估计的参数和贝叶斯公式求得样本属于哪一类的概率。最后一封邮件属于哪一类的概率参数表示如下:

one-hot编码比较特殊:

由于所有类的概率加和为




,垃圾邮件为二分类,所以邮件属于概率大于







的那一类。

为了使模型更具普适性,考虑到当某一特征没有在训练集中出现过,即某一个单词在某一类下没有出现过,或者某一单词在某一类下都出现过(意味着不出现的条件概率为0)。但不能说该单词在这一类下的条件概率为0。又或者在所有类中都未出现(即原始训练集中没有的词,而词典中有的词,即词典不依赖于训练集)。当来一个新样本时,如果不做处理,那么只要有一个分量的概率为0,由于特征之间的条件概率独立,连乘形式只要有一个为0,即整个概率为0,无意义。

拉普拉斯平滑:

其中













为第




个特征分量









的可能取值数。

B、N元多项分布模型

同样,上述贝叶斯模型中只考虑单词是否出现,即单词特征









服从伯努利分布,样本











服从n次独立的伯努利分布。而忽略了一个单词可能出现次数对邮件分类的影响。假设要统计某一单词出现的次数,那么有




















多项分布。只考虑单词是否出现的贝叶斯模型叫multi-variate Bernoulli event model,后者叫multinational event model。

同样以邮件分类问题介绍multinational event model,在之前的模型中,我们首先建立词典,并且特征向量长度为词典长度,并且从词典出发,对于邮件出现过的单词,在对应词典的位置标记为




,反之标记为




产生一个特征向量









。而multinational event model则从邮件出发,表示邮件中第




个单词,其值表示第




个单词在字典中出现的位置,那么









的取值则有






,其中V表示字典长度。这样一封邮件可以表示为












































表示第




封邮件的长度。这相当于掷一枚有V面的骰子




次,将观测值记录下来形成一封邮件。假设出现某一点的情况与第几次掷无关,也就是单词在邮件中出现的位置无关,而且每一次投掷都是独立的,即单词之间出现的事件是独立的。

文档的表示:

  1. one-hot表示

  1. 编号表示

可以看出两者方式的样本表示不同之处在于一个以词典维度对邮件中的词是否出现进行






编码,一个是以邮件维度对邮件中的词在词典中的编号进行编码,这就导致了两者表示的维度不同,特征服从的分布也不同。

一封邮件属于垃圾邮件的概率由贝叶斯公式有:

其中











似然函数,在垃圾邮件下产生




的条件概率,









为垃圾邮件的先验概率,


















对于所有样本都是一致,近似忽略。

由朴素贝叶斯的条件概率独立性假设有条件概率如下:

其中






















。同样最大化似然函数:

其中









表示第




封邮件的长度。所以上式中的参数有



































。由最大似然估计有:

其中





















无关,我们需要求的是









所有可能的取值。

最后一封邮件属于哪一类的概率参数表示如下:

其中
















表示邮件第




个词在词典中的编号。

one-hot表示和编号表示:

两种表示最大的差别在于包含的语义信息,one-hot表示信息不够丰富,只有






,所以需要高的维度,而编号表示信息相对丰富,维度低。然而on-hot表示是可以直接度量两个样本之间的相似性的(






表示是否存在,有语义意义的),而编号表示则不能直接度量两个样本之间的相似性(在词典中的编号是无语义的),但是可以把编号表示放回到集合中去度量两个样本的重合度。所以编号表示可以看作是one-hot的一种低维表示。

代码实战

int trainNB(Matrix X,Matrix Y)//训练函数的实现,注意对参数进行平滑处理{//类,特征,特征取值bayes.pY.initMatrix(CLASS_SUM,1,0,"ss");//两类初始化为2行的列向量bayes.pX_1Y.initMatrix(CLASS_SUM,X.col,0,"ss");//X_1Y表示在Y下X=1的概率,反之X=0的概率为1-bayes.pX.initMatrix(X.col,1,0,"ss");//int i,j,k;for(k=0; k<bayes.pX_1Y.row; k++){for(i=0; i<bayes.pX_1Y.col; i++){bayes.pX_1Y.data[k][i]=1;//平滑处理,默认出现一次,后期归一化时把特征向量的长度也考虑进去,这里的平滑是指每一类字典与整个字典的,未涉及测试//样本中的未登入词}}for(i=0; i<X.row; i++){if(Y.data[i][0]==0){bayes.pY.data[0][0]++;for(j=0; j<X.col; j++){bayes.pX_1Y.data[0][j]+=X.data[i][j];}}else {bayes.pY.data[1][0]++;for(j=0; j<X.col; j++){bayes.pX_1Y.data[1][j]+=X.data[i][j];}}}for(i=0; i<X.col; i++){//所有类下x各个特征分量出现的概率//bayes.pX.data[i][0]=(bayes.pX_1Y.data[0][i]-1) + (bayes.pX_1Y.data[1][i]-1) + 1;//bayes.pX.data[i][0]/=bayes.pY.data[0][0] + bayes.pY.data[1][0] + 2;//某一类下x各个特征分量出现的概率bayes.pX_1Y.data[0][i]/=bayes.pY.data[0][0] + 2;bayes.pX_1Y.data[1][i]/=bayes.pY.data[1][0] + 2;bayes.pX.data[i][0] = (bayes.pX_1Y.data[0][i] + bayes.pX_1Y.data[1][i])/2;}//计算出PY两类的概率for(k=0; k<bayes.pY.row; k++){bayes.pY.data[k][0]/=X.row;}cout<<"pY="<<bayes.pY.data[0][0]<<endl;for(k=0; k<bayes.pX_1Y.row; k++){for(i=0; i<bayes.pX_1Y.col; i++){cout<<bayes.pX_1Y.data[k][i]<<" & ";}cout<<"---";}}

详细代码:

https://github.com/myazi/myLearn/blob/master/Bayes.cpp

The End

来和小伙伴们一起向上生长呀!

扫描下方二维码,添加小詹微信,可领取千元大礼包并申请加入 Python 学习交流群,群内仅供学术交流,日常互动,如果是想发推文、广告、砍价小程序的敬请绕道!一定记得备注「交流学习」,我会尽快通过好友申请哦!

????长按识别,添加微信

(添加人数较多,请耐心等待)

????长按识别,关注小詹

(扫码回复 1024 领取程序员大礼包)

【机器学习】朴素贝叶斯相关推荐

  1. 秒懂机器学习---朴素贝叶斯

    秒懂机器学习---朴素贝叶斯 一.总结 一句话总结: 尽管朴素贝叶斯的条件独立性假设存在一定的问题,但是朴素贝叶斯算法仍然能取得比较理想的分类预测结果. 1.朴素贝叶斯分类算法 和 KNN分类算法和决 ...

  2. 机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类

    机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类 一.界面实现 from tkinter import * from tkinter import ttk import NBdef ma ...

  3. 机器学习朴素贝叶斯算法_机器学习中的朴素贝叶斯算法

    机器学习朴素贝叶斯算法 朴素贝叶斯算法 (Naive Bayes Algorithm) Naive Bayes is basically used for text learning. Using t ...

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

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

  5. 机器学习 | 朴素贝叶斯法知识总结

    机器学习 | 朴素贝叶斯法理论知识 贝叶斯决策论是概率框架下实施决策的基本方法.对分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记.朴素贝 ...

  6. 机器学习朴素贝叶斯_机器学习基础朴素贝叶斯分类

    机器学习朴素贝叶斯 In the previous stories, I had given an explanation of the program for implementation of v ...

  7. 机器学习---朴素贝叶斯模型

    机器学习-朴素贝叶斯模型 1.通俗解释: 朴素贝叶斯模型的基本思路就是利用贝叶斯的后验概率公式来推算当前属性下的数据样本属于哪一个类别.直白一点说,就是在特征属性为当前取值的条件下,该样本归属于那个类 ...

  8. 机器学习-朴素贝叶斯(基础讲解+代码实现+图像展示)

    朴素贝叶斯 定理: 某晚,C准备收拾东西接女朋友,那么小C要不要带伞呢. 已知:天气预报说今日降水概率为50%–P(A) 晚高峰堵车的概率为80%–P(B) 如果下雨,晚高峰堵车的概率是95%–P(B ...

  9. 5 机器学习 朴素贝叶斯算法 高斯模型 多项式模型 伯努利模型 拉普拉普平滑系数 TfidfVectorizer

    机器学习 1 朴素贝叶斯算法 1.1 朴素贝叶斯算法介绍 朴素贝叶斯算法是一种衡量标签和特征之间概率关系的监督学习算法,是一种专注于分类的算法."朴素"二字表示这个算法基于一个朴素 ...

  10. 机器学习-朴素贝叶斯。

    前言: 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯原理简单,也很容易实现,多用于文本分类,比如垃圾邮件过滤. 1.算法思想--基于概率的预测 决策树算法中提到朴 ...

最新文章

  1. 按钮右对齐_9张图,学会Excel中的对齐技巧
  2. 哈哈,netbeans5.5的Visual Web Pack终于出来了
  3. 透过浏览器看HTTP缓存(转)
  4. 转:智能卡测试操作系统技术
  5. 昨晚停网后,我写了一段Python代码破解了隔壁小姐姐的wifi密码,结果亮了!
  6. oracle19c 安装权限_Oracle 数据库安装系列一:19C 软件安装和补丁升级
  7. [Ext JS]5.1.1 分组标题的表格(Grouped Header Grid)与使用技巧
  8. android - 使用Parcelable序列化
  9. 每日一拍:linux升级python2.x到python3.x
  10. ubuntu16.04 安装完显卡驱动后分辨率固定640x480 解决
  11. Rust: codewars的Simple Substitution Cipher Helper算法题、N种不简单的解法集
  12. JAVA中链表的next解释
  13. 贝壳DMP平台建设实践
  14. 用C++实现强化学习,速度不亚于Python,这里有个框架可用
  15. 解决Google浏览器首页被2345网站劫持
  16. 今年最烂密码出炉,一秒钟就破解!你中枪了没?
  17. unity 图文混排方案
  18. Python123第六章答案
  19. linux下c语言调用mysql,Linux下C语言连接MySQL
  20. 辨别貔貅币的一种代码思路

热门文章

  1. Linux OOM 自动杀死进程(转)
  2. PHP中间件ICE,ICE的安装配置,ICE常见编译和运行(异常)错误(自测Php版本安装部分,因为php版本跟ice版本不一样失败)
  3. 如何配置一套优雅的Lua开发环境
  4. 不用FTP使用SecureCRT上传下载文件,并解决rz、sz command not found异常
  5. CSS五种水平居中:text-align margin incline-block flex relative
  6. PHP算法基于相同键合并数组
  7. JQUERY项目所用插件
  8. macappstore登不上去_Mac 链接不上AppStore的解决方法
  9. php如何向数组增加数据,php向数组中增加数据的方法是什么
  10. php 扩展 mysql_PHP链接MySQL的常用扩展函数