聊聊朴素贝叶斯

本贴最后更新于 2110 天前,其中的信息可能已经天翻地覆

机器学习中最简单,最适合入门的算法可以说就是朴素贝叶斯了,我尽可能使用非常通俗的语言来描述,让 0 基础的人也可以看懂,希望本文能让你找到机器学习的兴趣。

先举个栗子,假如一个房间里有 7 个人,其中 3 个人是日本人,4 个人是韩国人,如果这是从房间走出一个人,让你判断他是日本人的概率,显然你会说 3/7 。

那么,如果现在有两个房间,a 房间有 2 个日本人,2 个韩国人,b 房间有 1 个日本人,2 个韩国人,你一抬头,看到现在出来一个日本人,请问他来自房间 a 的概率是多少?

解决这个问题,我们就要知道条件概率,事件 A 在另外一个事件 B 已经发生条件下的发生概率。条件概率表示为 P(A|B),读作“在 B 条件下 A 的概率”。这里我们设【遇到一个日本人】记为事件 B,【来自房间 a】记为事件 A,那么可以通过经验得出 P(A|B) = 2/3 (日本人有 3 个,有 2 个在 a 房间,有 1 个在 b 房间,那么来自房间 a 的概率就是 2/3 )

为了搞清清楚 P(A|B) 与 P(A),P(B) 的关系,我们还要引入联合概率,P(A,B) 就是联合概率,表示看到一个来自房间 a 的日本人的概率。这种由多个随机变量决定的概率我们就叫联合概率。

很容易得到 P(A,B) = 2/7 = 2/3 x 3/7 = P(A|B) x P(B) 即 P(A,B) = P(A|B) x P(B) 同理可得 P(B,A) = P(B|A) x P(A) 由于 P(A,B) = P(B,A) 即 P(A|B) x P(B) = P(B|A) x P(A) 最后得到 P(A|B) = P(B|A) x P(A) / P(B)

这就是非常经典的贝叶斯法则。我们把 P(A),P(B) 叫作先验概率,之所以称为“先验”,是因为它是从数据资料统计得到的,不需要经过贝叶斯定理的推算。

P(B|A) 是给定 A 之后 B 出现的条件概率。在统计学中,我们也把 P(B|A) 写作似然函数 L(B|A)。在数学里,似然函数和概率是有区别的。概率是指已经知道模型的参数来预测结果,而似然函数是根据观测到的结果数据,来预估模型的参数。不过,当 B 值给定的时候,两者在数值上是相等的,在应用中我们可以不用细究。

P(A|B) 叫做后验概率,它是根据先验概率、似然函数来推导出来的。而似然函数,也就是我们根据数据集进行的训练结果。

类比上述例子,我们再看一下贝叶斯能干啥?

我给你一些标记正常的句子,再给你一些标记骂人的句子,然后让你看到一个句子,问你这个句子是骂人的句子的概率,请问你如何计算?

你说,这不就是侮辱性的文本屏蔽功能嘛,确实,我们应该都玩过王者荣耀吧,有时候自己会忍不住骂人,也会被别人骂,这种损人不利己的句子会伤害队友的感情,终将导致团灭。

现在假如给你一些人工标注的数据集,告诉你哪些是正常句子,哪些是骂人的句子,然后让你判断新的句子是否属于骂人的句子,你如何判断呢?

假定我们获取到了以下数据集作为训练,越简单越好,我们就选四条。前两个是正常句子,记作事件 A,后两个是侮辱性句子,记作事件 B。

这 走位 风骚 真 牛逼 你 真 傻逼 你 麻痹

这里的空格表示这是一个词,在实际应用中可借助分词工具将句子分解成单词列表。

很容易判断出 P(A) = 0.5,P(B) = 0.5,假如只有 P(A) 和 P(B) 这两个信息,现在给你一个新的句子,让你判断它是否是断侮辱性句子,你只能判断是 0.5 ,这不就相当于没有判断么,因此我们还需要通过上述训练数据集来训练出更多已知信息。假定现在让我们判断【你这风骚傻逼】这句话是否是侮辱性句子,那么如何让计算机来计算呢? 也就是让计算机来计算 【你这风骚傻逼】是侮辱性句子的概率是多少,不是侮辱性句子的概率是多少,哪个概率大,就算哪个。

明确目标,我们把 【你这风骚傻逼】记作事件 C,目标就是求解 P(A|C) 及 P(B|C),并比较他们的大小。

计算过程或训练过程,我先们求解 P(A|C) ,根据贝叶斯法则 P(A|C) = P(C|A) x P(A) / P(C), P(A) = 0.5,而 P(C) 和 P(C|A) 都是未知,这里就要搬出朴素贝叶斯来帮忙了。

特征之间相互独立指的是统计意义上的独立,即一个特征的出现的可能性不受其他特征所影响。 举个例子来说明:比如单词 A 出现在 B 后面的概率和出现在 C 后面的概率相同。很明显这种情况很不靠谱,这也正是朴素贝叶斯中朴素一词的含义。

我们假定 【你 这 风骚 傻逼】里的 4 个词出现是朴素独立的,那么 P(C) = P(你) x P(这) x P(风骚) x P(傻逼)
P(你) 的计算就是你出现的个数与所有不重复的词语的个数之比,即 2/8 = 0.25

同理可计算出:P(这) = 1/8 = 0.125 P(风骚) = 0.125 P(傻逼) = 0.125 P(C) = 0.25 x 0.125 x 0.125 x 0.125 = 0.00046875 P(C|A) = P(你, 这, 风骚, 傻逼 |A) = P(你|A) x P(这|A) x P(风骚|A) x P(傻逼|A)

由于训练数据集的数据量太少,导致 P(你 |A) = 0 ,实际中不能出现这样的情况,如果 P(你 |A) = 0,则 P(C|A) = 0,后面的概率也就不用计算了,导致概率的计算不够平滑,实际上,当概率出现 0 时,我们可以取一个最小值来替换掉 0 ,使得概率的计算变得平滑。这里,如果概率为 0,我们就取 0.0001。

因此

P(C|A) = P(你|A) x P(这|A) x P(风骚|A) x P(傻逼|A) = 0.0001 x 0.2 x 0.2 x 0.0001 = 0.0000000004。

因此计算出

P(A|C) = P(C|A) x P(A) / P(C) = 0.0000000004 x 0.5 / 0.00046875 = 0.000000426667

同理可以算出

P(B|C) = P(C|B) x P(B) / P(C) = P(你, 这, 风骚, 傻逼 |B) x 0.5 / 0.00046875 = (0.5 x 0.0001 x 0.0001 x 0.25 ) x 0.5 / 0.00046875 = 0.000001333333

很显然,P(B|C) 大于 P(A|C),因此句子 C 更可能为 B ,也就是说基于训练数据集,【你这风骚傻逼】 属于侮辱性句子。实际的应用中计算出的概率可能会非常的小导致计算机无法计算,这时我们会通过取对数(log)来将小数变成绝对值大于 1 的负数,道理是一样的。

推而广之,在哪些地方还可以使用朴素贝叶斯解决分类问题呢? 留给你思考。

(完)

欢迎关注微信公众号 somenzz 与我一起学习和交流。

  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • 朴素贝叶斯
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 76 关注
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖 • 1 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 2 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖
  • 自由行
    2 关注
  • 倾城之链
    23 引用 • 66 回帖 • 158 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 82 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    295 引用 • 750 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 3 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    169 引用 • 1527 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 570 关注
  • Follow
    4 引用 • 12 回帖 • 6 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 1 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    87 引用 • 122 回帖 • 622 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    157 引用 • 290 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 140 回帖
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 168 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注