朴素贝叶斯 Naive Bayes 分类算法

先验概率与后验概率

先验概率

先验概率(Prior probability)在维基百科中定义如下:

In Bayesian statistical inference, a prior probability distribution, often simply called the prior, of an uncertain quantity is the probability distribution that would express one’s beliefs about this quantity before some evidence is taken into account.

在贝叶斯统计推断中,一个不确定数量的先验概率分布,通常简称为先验,是指在考虑到某些证据之前,一个人对这个数量的信念的概率分布。

先验概率就是根据以往经验和分析得到的概率。通俗来说,对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。

举例如下:

  1. 掷一枚硬币,再不做任何实验的情况下,我们能够根据以往经验(硬币的性质:两面,质地均匀)估计正面出现的概率为50%,P(正面出现) = 50% 。
  2. 根据若干年的统计(经验)或者气候(常识)能够判断,今天下雨的概率30%,P(今天下雨) = 30% 。

以上的概率估计都是先验概率。

后验概率

后验概率(Posterior probability)在维基百科中定义如下:

In Bayesian statistics, the posterior probability of a random event or an uncertain proposition is the conditional probability that is assigned after the relevant evidence or background is taken into account.

在贝叶斯推断中,一个随机事件的后验概率是指:当与事件相关的一些证据或背景也被考虑进来时的条件概率。“后验”在这个语境下即指的是在考虑了与要被检验的特定事件相关的证据。

后验概率就是在先验概率的基础上加了一层“考虑”:结合我们已有的知识,将与待检验事件(即我们正在估计概率的随机事件)相关的因素也考虑进去后,我们对随机事件的概率的预估。

举例如下:

  1. 同样掷硬币,假如我们知道了这个硬币被人动了手脚,我们需要对其重新估计正面出现的概率,P(正面出现|硬币动过手脚)= 10% 。
  2. 我们看见今天天空乌云密布,估计今天下午结果的概率,P(今天下雨|乌云) = 60% 。

以上的概率估计为后验概率。

区别

先验概率基于已有知识对随机事件进行概率预估,但不考虑任何相关因素(P(c))。后验概率基于已有知识对随机事件进行概率预估,并考虑相关因素(P(c|x))

贝叶斯定理

贝叶斯定理(Bayes’ theorem)在维基百科中定义如下:

In probability theory and statistics, Bayes’ theorem (alternatively Bayes’ law or Bayes’ rule) describes the probability of an event, based on prior knowledge of conditions that might be related to the event. For example, if cancer is related to age, then, using Bayes’ theorem, a person’s age can be used to more accurately assess the probability that they have cancer, compared to the assessment of the probability of cancer made without knowledge of the person’s age.

在概率论和统计学中,贝叶斯定理(又称贝叶斯定律或贝叶斯规则)描述事件发生的概率,其基础是对可能与事件有关的条件的先验知识。例如,如果癌症与年龄有关,那么,使用贝叶斯定理,知道一个人的年龄,相比较于不知道该人年龄的情况下,可以被用来更准确地评估他们患癌症的概率。

那么其实很明显了,这里的“可能性”也是考虑了与随机事件相关的因素的,所以贝叶斯定理所阐述的也就是后验概率的获得方法。

用数学公式来表述贝叶斯定理:

$$ P ( c | x ) = \frac { P ( c , x ) } { P ( x ) } = \frac { P ( x | c ) P ( c ) } { P ( x ) } $$

c 表示的是随机事件发生的一种情况。x 表示的就是证据(evidence)、状况(condition),泛指与随机事件相关的因素。

  • P(c|x):在x的条件下,随机事件出现c情况的概率。(后验概率)
  • P(c):(不考虑相关因素)随机事件出现c情况的概率。(先验概率)
  • P(x|c):在已知事件出现c情况的条件下,条件x出现的概率。(后验概率)
  • P(x):x出现的概率。(先验概率)

落实到实际问题中,我们要计算 P(c|x),转化为计算 P(x)P(c)P(x|c)。而 P(x) 由于与 c 无关,而且作为共同的分母,在我们计算 c 的各种取值的可能性时并不会对各结果的相对大小产生影响,因此可以忽略。

经过上面的分析,最后求解 P(c|x) 的关键落在了求解 P(c)P(x|c) 上,而这两个概率分布是必须要通过我们手上现有的数据集来进行估计。

贝叶斯在文本分类中的应用

贝叶斯如何应用在文本分类的任务中呢?

假设我们有一个数据集,里面有很多个文档,每一个文档对应某一个类别,都是人工标注的。我们要做的任务就是利用已经有的数据集训练一个分类器(一种算法机制),等有了一篇新的文档,我们在不经过人工判断的情况下,利用已训练好的分类器(或算法)对该文档的类别进行判断。其实能够做文档分类的算法有很多,比如最近比较火的深度神经网络,但朴素贝叶斯算法对于文档的分类任务能够得到一个较好的效果,而且他的实现相较简单,算得上是一个性价比较高的算法。

数据建模(伯努利模型)

假设我们一共有 N 篇文档,一共有 $ C_1 $ 、$ C_2 $ 、$ C_3 $ 三个类别,三个类别的个数为 $ c_1 $ 、$ c_2 $ 、$ c_3 $ ,每篇文档又有很多个单词,所以由 N 篇文档可以产生词项集合,由 N 篇文档中所有不重复的单词构成。假设 x 为某一篇文档,C 为文档的类别,那么在文档为 x 的条件下,该文档属于类别 $ C_1 $ 的概率为 $ P(C_1|x) $,同理该文档 x 被分类为 $ C_2 $ 和 $ C_3 $ 的概率分别为 $ P(C_2|x) $ 和 $ P(C_3|x) $,最后计算出这三个概率,哪个概率大,我们就认为文档 x 属于那个类别。

剩下的问题就是 P(c|x) 如何计算?根据贝叶斯定理:

$$ P ( c | x ) = \frac { P ( c , x ) } { P ( x ) } = \frac { P ( x | c ) P ( c ) } { P ( x ) } $$

由于 P($C_1$|x)、P($C_2$|x)、P($C_3$|x) 的计算都含有 $ P(x) $ 项,最后比较大小我们只关注相对大小,而不关注绝对大小,所以该项可以约去,公式化简为:

$$ P ( c | x ) \varpropto P ( x | c ) P ( c ) $$

其中 $ P(c) $ 是文档出现在 c 类中的先验概率,可以通过已有的训练数据进行估计,假设属于类 $ C_1 $ 的文档个数为 $ c_1 $,属于类 $ C_2 $ 的文档个数为 $ c_2 $,属于类 $ C_3 $ 的文档个数为 $ c_3 $,文档总个数为 N ,因此 $ N = c_1 + c_2 + c_3 $,所以有 $ P(C_1) = c_1/N $,$ P(C_2) = c_2/N $,$ P(C_3) = c_3/N $ 。

那么,$ P( x | c ) $ 如何处理呢?一个很自然的想法是,x 表示文档,是由一个一个单词组成的。假设组成文档 x 的单词序列为 $ t_1 t_2 t_3 t_4 t_5 $,并假设单词 $ t_i $ 服从条件独立性假设,公式有如下转化:

$$ P( x | c ) = P( t_1 t_2 t_3 t_4 t_5 | c ) = P( t_1 | c ) P( t_2 | c ) P( t_3 | c ) P( t_4 | c ) P( t_5 | c ) $$

条件独立性假设实际上是忽略掉了某些属性之间(单词之间)可能存在的关联,假设属性的取值可能性都是独立的,这与现实世界是不相符的,但是这样做可以大大简化计算量,而且从分类的结果上看可以取得不错的效果。之所以称之为“朴素”贝叶斯,也正是因为进行了条件独立性假设,大大简化了模型参数估计。

$ P( t_i | c) $ 是词项 $ t_i $ 出现在类 c 文档中的条件概率,也可以把其视为正确类为 c 时 $ t_i $ 的贡献程度。最后的问题就是如何计算 $ P( t_i | c) $,其中 $ i = 1,2,…,M $,$ M $ 为单词集合的大小。这些数据都可以通过已有的训练数据进行估计。比如,我们可以通过训练集合,计算某个类别的文档集合的所有单词总数 $ N_c $(允许单词重复),然后计算单词 $ t_i $ 在该类文档集合中出现的频率 $ N_t $(次数),那么有:

$$ P( t_i | c ) = \frac {N_t} {N_c} , i = 1,2,3,…,M ; c = C_1,C_2,C_3 $$

因此我们可以通过训练集,计算出 $ P( t_i | c) $,$ P(c) $,从而可以估计 $ P( x | c ) $,最后得出 $ P( c | x ) $ 的估计。

$$ P ( c | x ) \varpropto P ( x | c ) P ( c ) \varpropto \prod_i P( t_i | c ) \cdot P(c) $$

算法计算流程

  1. 通过训练集计算出每个类别的文档个数、文档总数,从而估计出 P(c) ;
  2. 通过训练集计算出每个类别中词汇量总数、以及该类别中每个词项出现的频率(次数),从而估计出 单词 tc 类文档中出现的概率 P(t|c)
  3. 从训练集中抽取训练文档,通过 步骤1步骤2 计算的指标,根据朴素贝叶斯公式对 P(c|x) 进行估计,得出文档 x 属于类 c 的概率。

贝叶斯算法模型

关于贝叶斯算法的模型,根据处理先验条件概率 $ P( x | c ) $ 的方式的不同,又分为多项式模型伯努利模型混合模型

多项式模型

$$ P( x | c ) = P( t_1 t_2 \cdots t_k | c ) = P( t_1 | c ) P( t_2 | c ) \cdots P( t_k | c ) $$
上面公式 $t_1 t_2 \cdots t_k$ 的取值允许重复计算,并且在计算 $P( t_i | c )$ 使用的是单词频率

伯努利模型

$$ P( x | c ) = P( t_1 t_2 \cdots t_k | c ) = P( t_1 | c ) P( t_2 | c ) \cdots P( t_k | c ) $$
上面公式 $t_1 t_2 \cdots t_k$ 的取值不允许重复,即重复单词只计算一次,并且在计算 $P( t_i | c )$ 使用的是文档频率

高斯模型

当遇到连续变量预测,仅有该模型适用。计算 $P( t_i | c )$ 使用高斯分布的概率密度函数进行模拟。公式如下:

$$P\left(x_{i} | Y=y_{k}\right)=\frac{1}{\sqrt{2 \pi} \sigma_{i k}} \exp \left(- \frac{\left(x_{i}-\mu_{i k}\right)^{2}}{2 \sigma_{i k}^{2}}\right)$$

坚持原创技术分享,您的支持将鼓励我继续创作!