一、算法介绍

朴素贝叶斯算法,简称NB算法,是贝叶斯决策理论的一部分,是基于贝叶斯定理与特征条件独立假设的分类方法。

两个重要概念:

  • 先验概率是指根据以往经验和分析得到的概率,它往往作为“由因求果”问题中的“因”出现。是我们在未知条件下对事件发生可能性猜测的数学表示
  • 后验概率是指在得到“结果”的信息后重新修正的概率,是“执果寻因”问题中的“因” 。事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小

贝叶斯定理

贝叶斯理论是以18世纪的一位神学家托马斯·贝叶斯(Thomas Bayes)命名。通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的;然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述。贝叶斯公式:

  1. P(A|B) 是在 B 发生的情况下 A 发生的概率,即后验概率;
  2. P(A) 是 A 发生的概率,即先验概率;
  3. P(B|A) 是在 A 发生的情况下 B 发生的概率;
  4. P(B) 是 B 发生的概率。

也可以认为A是类别,B是特征,于是可以表示为:

二、贝叶斯定理举例

为了更形象地对贝叶斯定理进行说明,给大家举两个例子。

1.基于贝叶斯的降水概率问题

假设今天早上小明要出门,但是发现外面天空是多云状态,那么今天会不会下雨呢,或者说多云的情况下今天的降水概率是多少呢?

事件A:今天下雨
事件B:早上有云
事件 A|B:早上有云,今天下雨
事件 B|A:今天下雨,早上有云
P(A):今天下雨的概率
P(B):早上有云的概率
P(A|B):早上有云的话,今天下雨的概率
P(B|A):今天下雨的话,早上有云的概率
小明现在要计算的是今天早上有云,今天的降水概率是多少,即P(雨|云) = P(雨)·P(云|雨) / P(云)

假设:80% 的雨天早上是有云的,30% 的早上都是有云的,这几个月很干旱,平均每个月(30 天)下雨的天数是 6 天。

那么P(雨|云) = 20% * 80% / 30% = 5.333%。

即今天的降水概率为5.333%,几乎可以认为今天不下雨。

2.假阳性假阴性的检测。

有一天小明收到一束花,过了一会突然感觉全身发痒,于是小天去做了个简单的过敏检测:

真的过敏的人,检测会给“有”的概率是 90%
没有过敏的人,检测给“有”的概率是5%,这被称为假阳性
现在已知的条件是小明所在的市区中有 1% 的人有这种过敏,而小明去检测得到的结果是“有”,那么小天真正过敏的概率是多少呢?

P(过敏|有) = P(过敏) · P(有|过敏) / P(有)

观察公式发现,P(有)不知道,即我们不知道检测得到结果是“有”的一般可能性是多少。考虑一下如何计算P(有)。

根据已知条件可以得到:

1% 的人是真的过敏的,得到“有”的概率是 90%
99% 的人是没有过敏的,得到“有”的概率是 5%
所以P(有) = P(过敏)·P(有|过敏) + P(不过敏)·P(有|不过敏) = 1% × 90% + 99% × 5% = 5.85%

最终,小明计算得到了他真正过敏的概率:

P(过敏|有) = 1% × 80% / 5.85% = 13.68%。

三、垃圾邮件、短信的常规过滤方式

1. 基于黑名单过滤

可以维护一个骚扰电话号码、垃圾短信发送号码、垃圾邮件发送地址的黑名单。

  • 黑名单的搜集,有很多途径,比如,公开的网站下载,用户自主标记。标记个数超过一定阈值的号码,我们就可以定义为骚扰电话,并将它加入到我们的黑名单中。
  • 如果黑名单中的电话号码不多的话,我们可以使用散列表、二叉树等动态数据结构来存储,对内存的消耗并不会很大。如果我们把每个号码看作一个字符串,并且假设平均长度是16个字节,那存储50万个电话号码,大约需要10MB的内存空间。对于手机这样的内存有限的设备来说,这点内存的消耗也是可以接受的。
  • 黑名单中的电话号码很多呢?比如有500万个。这个时候,如果再用散列表存储,就需要大约100MB的存储空间。为了实现一个拦截功能,耗费如此多的手机内存,显然有点不合理。
  • 布隆过滤器最大的特点就是比较省存储空间,所以,用它来解决这个问题再合适不过。如果我们要存储500万个手机号码,我们把位图大小设置为10倍数据大小,也就是5000万,那也只需要使用5000万个二进制位(5000万bits),换算成字节,也就是不到7MB的存储空间。比起散列表的解决方案,内存的消耗减少了很多。
  • 时间换空间,把黑名单存储在服务器端上,把过滤和拦截的核心工作,交给服务器端来做。手机端只负责将要检查的号码发送给服务器端,服务器端通过查黑名单,判断这个号码是否应该被拦截,并将结果返回给手机端。这个解决思路完全不占用手机内存。不过网络通信是比较慢的,所以,网络延迟就会导致处理速度降低。而且必须联网。
  • 布隆过滤器会有判错的概率!如果它把一个重要的电话或短信,当成垃圾拦截了,对于用户来说,这是无法接受的。这是一个很大的问题。

2. 基于规则过滤

如果某个垃圾短信发送者的号码并不在黑名单中,那这种方法就没办法拦截了。所以,基于黑名单的过滤,还不够完善,再继续看基于规则的过滤。

通过短信的内容,来判断是垃圾短信。预先设定一些规则,如果短信符合这些规则,就判定它是垃圾短信。规则可以有很多,比如:

  1. 短信中包含特殊单词(或词语),比如一些非法、淫秽、反动词语等;
  2. 发送号码是群发号码,非正常的手机号码,比如+10123456****;
  3. 短信中包含回拨的联系方式,比如手机号码、微信、QQ、网页链接等,因为群发短信的号码一般都是无法回拨的;
  4. 短信格式花哨、内容很长,比如包含各种表情、图片、网页链接等;
  5. 符合已知垃圾短信的模板。与模板匹配,就可以判定为垃圾短信。

可以综合多条规则进行判断。比如,满足2条以上才会被判定为垃圾短信;
或者每条规则对应一个不同的得分,某条短信的总得分超过某个闽值,才会被判定为垃圾短信。

以上两种过滤,比较符合我们的想法,也有广泛应用,如网站维护的IP白名单、黑名单,以及定义的防火墙规则,其实都是上面所讲的。

四、基于概率统计的朴素贝叶斯分类过滤

朴素贝叶斯定理通常应用于人工智能领域,最常见的是朴素贝叶斯分类算法,也就是接下来要实现的基于概率的过滤器,本质上是通过计算概率来判断。

对于一条短信,我们通常可以通过这个短信的内容进行判断是否为垃圾短信。对于计算机来说无法直接通过内容来判断,但是我们可以将短信内容中的一些特征项提取出来,供计算机判断。

通过分词算法可以将短信内容分割成由n个单词的组合,那么现在的问题就变成了包含这些单词的短信是垃圾短信的概率是多少。

P(是垃圾短信 | 单词1、单词2 ... 单词 n 同时出现) = ?%

我们使用朴素贝叶斯定理,将这个概率转换成其他三个概率来求解:

推导过程:

  • P(是垃圾短信)的值很容易计算,样本中垃圾短信数与样本总数之比即可得到。
  • P(单词1、单词2 ... 单词 n 同时出现|是垃圾短信)

根据独立事件发生的概率计算公式:P(A*B) = P(A)*P(B)拆分为:

P(单词1、单词2 ... 单词 n 同时出现|是垃圾短信)=P(单词1|是垃圾短信)*P(单词2|是垃圾短信)*...*P(单词 n |是垃圾短信)。

P(单词i 出现在短信中 | 是垃圾短信)表示垃圾短信中包含单词i 这个单词的概率。

  • P(单词1、单词2 ... 单词 n 同时出现),不去计算。

推导到这里,我们发现唯一不好计算的就是分母,那我们再次发散思维,我们可以分别计算一条短信是垃圾短信和非垃圾短信的概率,然后计算他们的倍数,如果倍数相差悬殊,那么我们就可以认为是垃圾短信。例如:

假设是垃圾短信的概率是p1,不是垃圾短信的概率是p2,这样一来,可以通过计算p1p2的倍数关系来最终确定是否为垃圾短信,例如若p1p2的十倍,那么可以认为短信一定是垃圾短信了。公式如下:

我们只需要计算p1/p2就能得出是否是垃圾短信了。

大家其实也看得出来,分母可以被约分约掉的。

实际上,我们可以结合三种不同的过滤方式的结果,对同一个短信处理,如果三者都表明这个短信是垃圾短信,才把它当作垃圾短信拦截过滤,这样就会更精准。同时,需要大量的实验,不断调整策略,并且需要权衡最终的准确率以及是否能把所有垃圾短信都找到。

五、贝叶斯定理应用

1.吸毒者检测

下面展示贝叶斯定理在检测吸毒者时的应用。假设一个常规的检测结果的灵敏度和特异度均为99%,即吸毒者每次检测呈阳性(+)的概率为99%。而不吸毒者每次检测呈阴性(-)的概率为99%。从检测结果的概率来看,检测结果是比较准确的,但是贝叶斯定理却可以揭示一个潜在的问题。假设某公司对全体雇员进行吸毒检测,已知0.5%的雇员吸毒。请问每位检测结果呈阳性的雇员吸毒的概率有多高?

2.胰腺癌检测

基于贝叶斯定理:即使100%的胰腺癌症患者都有某症状,而某人有同样的症状,绝对不代表该人有100%的概率得胰腺癌,还需要考虑先验概率,假设胰腺癌的发病率是十万分之一,而全球有同样症状的人有万分之一,则此人得胰腺癌的概率只有十分之一,90%的可能是是假阳性。

3.不良种子检测

基于贝叶斯定理:假设100%的不良种子都表现A性状,而种子表现A性状,并不代表此种子100%是不良种子,还需要考虑先验概率,假设一共有6万颗不良种子,在种子中的比例是十万分之一(假设总共有60亿颗种子),假设所有种子中有1/3表现A性状(即20亿颗种子表现A性状),则此种子为不良种子的概率只有十万分之三。

六、总结

"概率论只不过是把常识用数学公式表达了出来"---拉普拉斯。

之所以贝叶斯方法在机器学习中如此重要,就是因为人们希望机器人能像人那样思考,而很多问题是需要计算机在已知条件下做出最佳决策的决策,而贝叶斯公式就是对人脑在已知条件下做出直觉判断的一种数学表示。

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

  • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  • 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练。
  • 对缺失数据不太敏感,算法比较简单,常用于文本分类。
  • 可应用于图像识别。

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

  • 理论上朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此。因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果并不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  • 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  • 由于是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
  • 对输入数据的表达形式很敏感。

我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考阅读:

  1. https://blog.csdn.net/m0_37264516/article/details/87481785
  2. https://blog.csdn.net/qq_21201267/article/details/98695641
  3. https://www.cnblogs.com/love528/p/10125089.html

算法高级(43)-过滤垃圾邮件、短信?-朴素贝叶斯算法相关推荐

  1. 人工智能知识全面讲解:垃圾邮件克星——朴素贝叶斯算法

    6.1 什么是朴素贝叶斯 6.1.1 一个流量预测的场景 某广告平台接到小明和小李两家服装店的需求,准备在A.B两个线上渠道 投放广告.因为小明和小李两家店都卖女装,属于同一行业相同品类的广告, 所以 ...

  2. 朴素贝叶斯算法--过滤垃圾短信

    文章目录 1. 基于黑名单过滤 2. 基于规则过滤 3. 基于概率统计过滤 4. 总结 上一节我们讲到,如何用位图.布隆过滤器,来 过滤重复数据.今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信? ...

  3. sklearn中的朴素贝叶斯算法

    sklearn中的朴素贝叶斯分类器 之前理解朴素贝叶斯中的结尾对sklearn中的朴素贝叶斯进行了简单的介绍. 此处对sklearn中的则对sklearn中的朴素贝叶斯算法进行比较详细介绍.不过手下还 ...

  4. 从头开始实现朴素贝叶斯算法

    一文学会朴素贝叶斯并且从头开始用 Python 实现朴素贝叶斯算法 朴素贝叶斯算法是简单并且有效的算法,而且应该是你尝试解决分类问题的第一个方法. 在这个教程中,你将会学习朴素贝叶斯算法,包括它如何工 ...

  5. 朴素贝叶斯算法实现垃圾邮件过滤(Python3实现)

    目录 1.朴素贝叶斯实现垃圾邮件分类的步骤 2.邮件数据 3.代码实现 4.朴素贝叶斯的优点和缺点 1.朴素贝叶斯实现垃圾邮件分类的步骤 (1)收集数据:提供文本文件. (2)准备数据:将文本文件解析 ...

  6. 机器学习:朴素贝叶斯算法与垃圾邮件过滤

    简介 贝叶斯算法是由英国数学家托马斯·贝叶斯提出的,这个算法的提出是为了解决"逆向概率"的问题.首先我们先来解释下正向概率与逆向概率的含义: 正向概率:假设一个箱子里有5个黄色球和 ...

  7. 朴素贝叶斯算法实现垃圾邮件过滤

    朴素贝叶斯算法实现垃圾邮件过滤 1.1 题目的主要研究内容 (1)贝叶斯垃圾邮件过滤技术是一种电子邮件过滤的统计学技术,它使用贝叶斯分类来进行垃圾邮件的判别. (2)贝叶斯分类的运作是借着使用标记(一 ...

  8. 【人工智能】机器学习及与智能数据处理Python使用朴素贝叶斯算法对垃圾短信数据集进行分类

    朴素贝叶斯算法 输入:样本集合D={(x_1,y_1),(x_2,y_2) (x_m,y_m); 待预测样本x; 样本标记的所有可能取值{c_1,c_2,c_3 c_k}; 样本输入变量X的每个属性变 ...

  9. python:基于朴素贝叶斯算法的垃圾邮件过滤分类

    目录 一.朴素贝叶斯算法 1.概述 2.推导过程 二.实现垃圾邮件过滤分类 1.垃圾邮件问题背景 2.朴素贝叶斯算法实现垃圾邮件分类的步骤 3.python实现 参考学习网址:https://blog ...

最新文章

  1. 存储过程内建临时表和临时函数,合并一个由存储过程返回的表
  2. python3.5.2-python升级 (2.6升级到3.5)
  3. JQ 实现点击按钮显示弹窗,点击非弹窗和按钮区域隐藏弹窗
  4. 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
  5. 水晶报表中图片不显示解决方案
  6. 【regresson下】L1 loss和L2 loss和Smooth L1 Loss的比较
  7. Zxw图纸,鑫制造图纸,蓝瑞图纸,猎人图纸,维修宝典,刚开通 的带维修案例平台
  8. cydia软件路径_cydia软件包路径
  9. 【OMNeT++】ALOHA协议仿真中的channelUtilization
  10. android5.1 淘汰,大S被淘汰! 上1:5油短卡LOSI 5T开箱
  11. 2021-11-3 软件模拟IIC时序,并和EEPROM存储芯片24C02双向通信以及显示功能
  12. [Golang]写文件的权限定义perm
  13. Rust GUI 编程漫谈:超越 Web 与原生 GUI
  14. 面向对象之相关综合练习题
  15. YGG SEA 投资 5 万美元,购买 ARPG 游戏《变形机甲》中的 NFT 资产
  16. Windows mobile PPC 下利用 tmail.exe 发送短信、彩信、邮件
  17. Python 引入模块后VsCode出现问题提示 “could not be resolved” 解决方案
  18. 设计模式之禅-策略模式
  19. 利用宽乐通信实现PHP网页收发短信
  20. 谈制定有效测试策略的重要性

热门文章

  1. 如何清空android ListView控件的内容
  2. 移动语音引擎相关开发笔记
  3. IP地址子网的划分机制
  4. Install And Configure ColdFusion MX 6.1 on Windows
  5. ​insert带来的TiDB集群性能瓶颈排障
  6. java ocr linux_linux系统如何使用tess4j(java)进行ocr图片文字识别
  7. lisp压盖_华为笔试题--LISP括号匹配 解析及源码实现
  8. Mysql探究与学习大纲--主要是为了自己复习方便
  9. 第二章--电商设计表
  10. python--学习1