主旨

讨论贝叶斯垃圾邮件分类问题中联合概率的计算问题。通过借鉴现有的资料,整理出一种数学上等价,同时基于本科概率论课程较容易理解的计算公式。

背景知识

2002年Paul Graham提出了一种利用贝叶斯原理做垃圾邮件分类的方法[1],这种方法在应用中取得了良好的效果。阮一峰发表了一篇中文介绍资料[2]对此方法做了清晰、明确的介绍。
在Paul Graham提出的垃圾邮件分类算法中,涉及到使用文本中出现的多个单词判断当前文本是否是垃圾邮件的问题,即当文本中出现了多个单词,如何计算垃圾邮件的概率。在文献[2]中,第十部分“联合概率的计算”就是对这部分的描述。

问题导入

在[1]中,对于给定多个单词计算联合概率的原理并未涉及,而是从其他位置[3][4]引用结论,给出

其中r_i代表P{TRUE | 第i个条件成立},公式成立的两个假定
1) N个条件之间两两独立且
2) TRUE和FALSE的先验概率相等

此外文献[2]的作者给出了N = 2条件下的一种推导方法(参阅第十部分“联合概率的计算”),想证明上述公式。在我写作这篇文章的时候(2017年2月),[2]中间已经有不少公式已经不可见,好在通过搜索引擎,基本可以复现出[2]作者的推导过程如下

问题在于无论是文献[4]还是文献[2],对于上述公式的推导都不够易懂。从 [2]的读者评论区讨论就可以看到,很多读者不理解[2]的作者是如何定义出E1/E2两个事件并完成推导的,我也和这些读者一样,无法理解[2]的作者的推导方法。
[4]中同样给出了N = 2情况下公式的推导过程,但对于我来说,其中也有不少难以理解的步骤,例如假定S/J两者统计独立之后,给出的数学表达式就较为费解。在[2]的讨论区中,也没有人对[4]中的推导逻辑给予清晰的说明。

此外,上述公式中为了计算P,都需要计算P(S|Wi)。从文本中统计得到的Wi词频是P(Wi|S),如果要计算P(S|Wi),还要用贝叶斯公式计算一遍,从程序设计讲,如果能直接使用P(S|Wi)计算,则会直观的多。

本文受到[2]的讨论区中多名评论者的启发。

讨论与推导

定义:

  1. Wi W_i为第 i i个单词出现这一事件,i=1…Ni = 1…N. 这里先从 N=2 N=2的情况开始分析。在分析中假定不同单词的出现概率互相独立。
  2. S S代表当前邮件是垃圾邮件,S¯¯¯\overline{S}代表当前邮件不是垃圾邮件。

问题可以描述为计算

P(S|W1W2)

P(S | W_1W_2)

根据贝叶斯公式,

P(S|W1W2)=P(S)∗P(W1W2|S)/P(W1W2)

P(S | W_1W_2) = P (S) * P(W_1W_2| S) / P(W_1W_2)
考虑到[1][2]在文本中W1与W2统计独立的假定, P(W1W2|S)=P(W1|S)∗P(W2|S) P(W_1W_2| S) = P(W_1|S) * P(W_2|S)
将这条推论代入上式,得到

P(S|W1W2)=P(S)∗P(W1|S)∗P(W2|S)/P(W1W2)

P(S | W_1W_2) = P (S) * P(W_1|S) * P(W_2|S) / P(W_1W_2)

注意:此处切不可由统计独立性误以为P(W1W2) = P(W1)P(W2).

根据全概率公式,上述公式可得到

P(S│W1W2)=P(S)∗P(W1|S)∗P(W2|S)P(S)∗P(W1W2│S)+P(S¯¯¯)∗P(W1W2│S¯¯¯)=P(S)∗P(W1|S)∗P(W2|S)P(S)∗P(W1|S)∗P(W2|S)+P(S¯¯¯)∗P(W1|S¯¯¯)∗P(W2|S¯¯¯)

P(S│W_1 W_2 )= \frac{ P(S)*P(W_1 |S)*P(W_2 |S)}{P(S)*P(W_1 W_2│S)+P(\overline{S})*P(W_1 W_2│\overline{S})}= \frac{P(S)*P(W_1 |S)*P(W_2 |S)}{P(S)*P(W_1 |S)*P(W_2 |S)+P(\overline{S})*P(W_1 |\overline{S})*P(W_2 |\overline{S})}

扩展到N个单词的情形

P(S│W1W2...WN)=P(S)∗∏Ni=1P(Wi|S)P(S)∗∏Ni=1P(Wi|S)+P(S¯¯¯)∗∏Ni=1P(Wi|S¯¯¯)

P(S│W_1 W_2...W_N )= \frac{ P(S)*\prod_{i=1}^{N}P(W_i|S) }{P(S)*\prod_{i=1}^{N}P(W_i|S)+P(\overline{S})*\prod_{i=1}^{N}P(W_i|\overline{S})}

在上式右边, P(Wi|S) P(W_i|S)是训练集垃圾邮件中 Wi W_i出现的概率, P(Wi|S¯¯¯) P(W_i|\overline{S})是训练集正常邮件中Wi出现的概率。 P(S) P(S)是垃圾邮件的先验概率, P(S¯¯¯)=1–P(S) P(\overline{S}) = 1 – P(S). 这些概率都是基于训练集可以知道的,因此推导到这一步就已经可以算出 P(S│W1W2...WN) P(S│W_1 W_2...W_N )了。

问题是,这样推出的公式是否与文献[1]或[2]中使用的联合概率公式等价?是等价的,N=2的情况下证明过程如下

根据贝叶斯公式
P(W1|S)=P(S|W1)∗P(W1)/P(S) P(W_1|S) = P(S|W_1)*P(W_1)/P(S)
P(W2|S)=P(S|W2)∗P(W2)/P(S) P(W_2|S) = P(S|W_2)*P(W_2)/P(S)

代入前述公式

P(S│W1W2)=P(S)∗(P(S│W1)P(W1))/P(S)∗(P(S│W2)P(W2))/P(S)P(S)∗(P(S│W1)P(W1))/P(S)∗(P(S│W2)P(W2))/P(S)+P(S¯¯¯)∗(P(S¯¯¯│W1)P(W1))/P(S¯¯¯)∗(P(S¯¯¯│W2)P(W2))/P(S¯¯¯)

P(S│W_1 W_2 )= \frac{P(S)*(P(S│W_1 )P(W_1 ))/P(S) *(P(S│W_2 )P(W_2 ))/P(S) }{P(S)*(P(S│W_1 )P(W_1))/P(S)*(P(S│W_2 )P(W_2))/P(S) +P(\overline{S})*(P(\overline{S}│W_1 )P(W_1))/P(\overline{S})*(P(\overline{S}│W_2 )P(W_2))/P(\overline{S})}

根据[1]和[2]的假定 P(S)=P(S¯¯¯)=1/2 P(S) = P(\overline{S})=1/2,则上式等于

P(S│W1W2)=(P(S│W1)P(W1))(P(S│W2)P(W2))(P(S│W1)P(W1))(P(S│W2)P(W2))+(P(S¯¯¯│W1)P(W1))(P(S¯¯¯│W2)P(W2)))=P(S│W1)(S│W2)P(S│W1)(S│W2)+P(S¯¯¯│W1)P(S¯¯¯│W2)=P(S│W1)(S│W2)P(S│W1)(S│W2)+(1−P(S│W1))(1−P(S│W2))

P(S│W_1 W_2 )= \frac{(P(S│W_1 )P(W_1 ))(P(S│W_2 )P(W_2 )) }{(P(S│W_1 )P(W_1))(P(S│W_2 )P(W_2)) +(P(\overline{S}│W_1 )P(W_1))(P(\overline{S}│W_2 )P(W_2)))} = \frac{P(S│W_1 )(S│W_2 )}{P(S│W_1 )(S│W_2 ) + P(\overline{S}│W_1 )P(\overline{S}│W_2 )} =\frac{P(S│W_1 )(S│W_2 )}{P(S│W_1 )(S│W_2 ) + (1-P(S│W_1 ))(1-P(S│W_2 ))}

与[1]和[2]中给出的形式完全相同.

总结

针对贝叶斯垃圾邮件分类问题,本文利用概率论课程中学过的方法,推导出与[1]和[2]中等价的联合概率计算方法。

P(S│W1W2...WN)=P(S)∗∏Ni=1P(Wi|S)P(S)∗∏Ni=1P(Wi|S)+P(S¯¯¯)∗∏Ni=1P(Wi|S¯¯¯)

P(S│W_1 W_2...W_N )= \frac{ P(S)*\prod_{i=1}^{N}P(W_i|S) }{P(S)*\prod_{i=1}^{N}P(W_i|S)+P(\overline{S})*\prod_{i=1}^{N}P(W_i|\overline{S})}
这个方法不但利于理解,而且其中需要的变量均为 P(Wi|S) P(W_i|S)或 P(Wi|S¯¯¯) P(W_i|\overline{S})的形式,对训练集统计就可以得到。

参考文献

[1] http://www.paulgraham.com/spam.html
[2] http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_two.html
[3] http://www.paulgraham.com/naivebayes.html
[4] http://www.mathpages.com/home/kmath267.htm

贝叶斯垃圾邮件分类问题中联合概率的推导相关推荐

  1. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  2. python实现朴素贝叶斯垃圾邮件分类

    查看通俗易懂的贝叶斯垃圾邮件分类原理 请点击此处 下载邮件数据 请点击此处 import os import re import string import math import numpy as ...

  3. 朴素贝叶斯-垃圾邮件分类实现

    1. 前言 <朴素贝叶斯算法(Naive Bayes)>,介绍了朴素贝叶斯原理.本文介绍的是朴素贝叶斯的基础实现,用来垃圾邮件分类. 2. 朴素贝叶斯基础实现 朴素贝叶斯 (naive B ...

  4. 文本处理之贝叶斯垃圾邮件分类

    本文所讲解的是如何通过Python将文本读取,并且将每一个文本生成对应的词向量并返回. 文章的背景是将50封邮件(包含25封正常邮件,25封垃圾邮件)通过贝叶斯算法对其进行分类. 主要分为如下几个部分 ...

  5. 机器学习之贝叶斯垃圾邮件分类

    代码来源于:https://www.cnblogs.com/huangyc/p/10327209.html  ,本人只是简介学习 1. 贝叶斯.py import numpy as np from w ...

  6. 朴素贝叶斯-垃圾邮件(中文的)处理

    #coding=utf-8 from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np import jie ...

  7. 朴素贝叶斯——垃圾邮件过滤

    文章目录 利用朴素贝叶斯进行文档分类 1.获取数据集 2.切分文本 3.构建词表和分类 4.构建分类器 5.测试算法 利用朴素贝叶斯进行垃圾邮件过滤 1.导入数据集 2.垃圾邮件预测 总结 利用朴素贝 ...

  8. 机器学习贝叶斯-垃圾邮件识别

    文章目录 一.何为贝叶斯 二.项目实战-垃圾分类 1. 导包 2. 代码示例 3. 测试代码 4.测试结果 一.何为贝叶斯 贝叶斯基本公式:P(A|B)=P(B|A)*P(A)/P(B) 假设事件 B ...

  9. 机器学习-朴素贝叶斯-垃圾邮件

    一:朴素贝叶斯算法概述 1:朴素贝叶斯(Naïve Bayes, NB)算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法.朴素:特征条件独立:贝叶斯:基于贝叶斯定理.属于监督学习的生成模型,实现 ...

最新文章

  1. C#语法:委托与方法
  2. Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
  3. DNS and Bind (二)
  4. Linux 命令行中的文件名/文件路径中使用通配符的说明
  5. Tomcat整合APR
  6. php cookie突然没,PHP利用Cookie设置用户30分钟未操作自动退出功能
  7. 被劝退的准中年人日记——劝退后第一天
  8. 正则表达式之非捕获组
  9. 个人博客升级改造ing
  10. 高德地图坐标拾取组件
  11. 【资源下载】SocketTool 下载 资源下载
  12. nginx的cgi模块
  13. 移动端 Retina屏 各大主流网站1px的解决方案
  14. matlab 剪毛刺,MATLAB消除曲线毛刺Outlier Detection and Removal [hampel]
  15. 只要每天坚持玩游戏,人生很快就会过去
  16. 高等数学强化3:一元函数积分学 P积分
  17. 资源|最新WEB前端开发全套视频教程
  18. ug更改java的环境变量_UG中的语言环境变量设置
  19. EXCEL函数篇之一文读懂VLOOKUP精准查找、近似查找、模糊查找的区别
  20. GitFlow Workflow

热门文章

  1. 这个必用的开发框架,是多少程序员头秃的存在?
  2. uni-app 图标字体引用
  3. 字符常量/字符变量 计算sizeof
  4. 关于Lemur(1)
  5. HTML5七夕情人节表白网页(幻化3D相册) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
  6. day9 进程 协程
  7. Matlab代码导入STM32F103流程
  8. Spring框架【超详细学习笔记】
  9. JAVA中的scanner.Next和scanner.NextLine
  10. 导入项目后R.id.lv 报错!求大神解答