聊聊朴素贝叶斯

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

机器学习中最简单,最适合入门的算法可以说就是朴素贝叶斯了,我尽可能使用非常通俗的语言来描述,让 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 关注
  • 朴素贝叶斯
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 5 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    69 引用 • 372 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 2 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 1 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • danl
    132 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 6 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 587 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 550 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 19 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    266 引用 • 665 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • 工具

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

    286 引用 • 729 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    222 引用 • 473 回帖 • 1 关注
  • 导航

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

    40 引用 • 173 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 721 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 2 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 724 关注