zoukankan      html  css  js  c++  java
  • 朴素贝叶斯算法的理解与实现

    github:代码实现
    本文算法均使用python3实现


    1. 朴素贝叶斯是什么

      依据《统计学方法》上介绍:

    朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 $ x $ ,利用贝叶斯定理求出后验概率最大的输出 $ y $ 。

      可能读完上面这段话仍旧没办法理解朴素贝叶斯法到底是什么,又是怎样进行分类的。下面我尽可能详细且直观地描述朴素贝叶斯法的工作原理。首先我们需要知道的是,朴素贝叶斯是基于概率论的分类算法。然后我们来了解几个统计学小概念。(我们将使用以下这个例子来贯穿全文进行讲解。)

    在夏季,某公园男性穿凉鞋的概率为 $ frac{1}{2} $ ,女性穿凉鞋的概率为 $ frac{2}{3} $ ,并且该公园中男女比例通常为 $ 2:1 $ ,问题:若你在公园中随机遇到一个穿凉鞋的人,请问他的性别为男性或女性的概率分别为多少?


    ## 1.1 先验概率   **先验概率(prior probability)**是指根据以往经验和分析得到的概率,如全概率公式(后面会讲)。   我们使用以上例子来解释一下什么是先验概率。根据以上例子我们设定:假设某公园中一个人是男性为事件 $ Y=y_{men} $ ,是女性则是 $ Y=y_{women} $ ;一个人穿凉鞋为事件 $ X = x_1 $ ,未穿凉鞋为事件 $ X = x_0 $ 。而一个人的性别与是否穿凉鞋这两个事件之间是**相互独立**的。   于是我们可以看到该例子中存在四个先验概率: $$ P(X = x_1) 与 P(X = x_0) $$ $$ P(Y=y_{men}) 与 P(Y=y_{women}) $$   其中 $ P(Y=y_{men}) 与 P(Y=y_{women}) $ 可以根据例子中“该公园中男女比例通常为 2:1 ” 这一以往经验求得:$ P(Y=y_{men})=frac{2}{3} $ 以及 $ P(Y=y_{women})=frac{1}{3} $ 。而先验概率 $ P(Y=y_{men}) 与 P(Y=y_{women}) $ 并不能直接得出,需要根据**全概率公式**来求解。在学习全概率公式之前,我们先了解一下**条件概率**。
    ## 1.2 条件概率   **条件概率**是指在事件 $ Y=y $ 已经发生的条件下,事件 $ X=x $ 发生的概率。条件概率可表示为: $ P(X=x|Y=y) $ 。而条件概率计算公式为: $$ P(X=x|Y=y) = frac{P(X=x,Y=y)}{P(Y=y)} $$   其中 $ P(X=x,Y=y) $ 是**联合概率**,也就是两个事件共同发生的概率。而 $ P(Y=y) 以及 P(X=x) $ 是**先验概率**。   我们用例子来说明一下就是: “某公园男性穿凉鞋的概率为 $ frac{1}{2} $ ”,也就是说“是男性的前提下,穿凉鞋的概率是 $ frac{1}{2} $ ”,此概率为条件概率,即 $ P(X=x_1 | Y=y_{men}) = frac{1}{2} $ 。同理“女性穿凉鞋的概率为 $ frac{2}{3} $ ” 为条件概率 $ P(X=x_1 | Y=y_{women}) = frac{1}{2} $ 。
    ## 1.3 全概率公式   **全概率公式**是指:如果事件 $ Y=y_1 ,Y=y_2,...,Y=y_n $ 可构成一个完备事件组,即它们两两互不相容,其和为全集。则对于事件 $ X=x $ 有: $$ P(X=x) = sum_{i=1}^n P(Y=y_i)P(X=x|Y=y_i) $$   因此对于上面的例子,我们可以根据全概率公式求得: $$ P(X=x_1) = P(Y=y_{men}) P(X=x_1|Y=y_{men}) + P(Y=y_{women}) P(X=x_1|Y=y_{women}) = frac{2}{3} imes frac{1}{2} + frac{1}{3} imes frac{2}{3} = frac{5}{9} $$ $$ P(X=x_0) = P(Y=y_{men}) P(X=x_0|Y=y_{men}) + P(Y=y_{women}) P(X=x_0|Y=y_{women}) = frac{2}{3} imes frac{1}{2} + frac{1}{3} imes frac{1}{3} = frac{4}{9} $$   也就是说不考虑性别的情况下,公园中穿脱鞋的概率为 $ frac{5}{9} $ ,不穿拖鞋的概率为 $ frac{4}{9} $ 。
    ## 1.4 后验概率   **后验概率**是指,某事件 $ X=x $ 已经发生,那么该事件是因为事件 $ Y=y $ 的而发生的概率。也就是上例中所需要求解的“在知道一个人穿拖鞋的前提下,这个人是男性的概率或者是女性的概率是多少”。后验概率形式化便是: $$ P(Y=y_{men}|X=x_1) $$ 。   **后验概率**的计算要以先验概率为基础。后验概率可以根据通过**贝叶斯公式**,用**先验概率**和**似然函数**计算出来。   **贝叶斯公式**如下: $$ P(Y=y_{men}|X=x_1) = frac{ P(X=x_1|Y=y_{men})P(Y=y_{men}) }{ P(X=x_1) } = frac{ P(X=x_1|Y=y_{men})P(Y=y_{men}) }{ sum_{i= { men,women } } P(Y=y_i)P(X=x_1|Y=y_i) } $$   其中 $ P(Y=y_{men}|X=x_1) $ 为所求**后验概率**,$ P(X=x_1|Y=y_{men}) $ 为**条件概率**,$ P(Y=y_{men}) $ 为**先验概率**, $ P(X=x_1) = sum_{i= lbrace men,women brace } P(Y=y_i)P(X=x_1|Y=y_i) $ 为**全概率公式**。
      **朴素贝叶斯算法正是利用以上信息求解后验概率,并依据后验概率的值来进行分类。**
      使用上面的例子来进行理解,后验概率为: $$ P(Y=y_{men}|X=x_1) = frac{P(X=x_1|Y=y_{men})P(Y=y_{men})}{P(X=x_1)} = frac{frac{1}{2} imes frac{2}{3}}{frac{5}{9}} = frac{3}{5} $$ $$ P(Y=y_{women}|X=x_1) = frac{P(X=x_1|Y=y_{women})P(Y=y_{women})}{P(X=x_1)} = frac{frac{2}{3} imes frac{1}{3}}{frac{5}{9}} = frac{2}{5} $$   也就是说,在知道一个人穿拖鞋的前提下,这个人是男性的概率是 $ frac{3}{5} $ ,是女性的概率是 $ frac{2}{5} $ 。如果问题是“判断该人是男性还是女性”,此问题就是一个分类问题。由于依据贝叶斯公式计算的后验概率是男性的概率大于是女性的概率,即由于 $ P(Y=y_{men}|X=x_1) > P(Y=y_{women}|X=x_1) $ ,那么我们就可以将其**分类为男性**(实际在使用朴素贝叶斯进行分类时,不需要求解分母 $ P(X=x_1) $ )。   到此,我们已经使用例子来讲解了使用**朴素贝叶斯**进行分类的基本步骤以及简单的原理了。接下来我们将对**朴素贝叶斯**的原理进行详细地探讨。

    2. 朴素贝叶斯的推导

      对于样本集: $$ D = lbrace (x_1^{(1)}, x_2^{(1)},...,x_n^{(1)},y_1),(x_1^{(2)}, x_2^{(2)},...,x_n^{(2)},y_2),...,(x_1^{(m)}, x_2^{(m)},...,x_n^{(m)},y_m) $$
      其中 $ m $ 表示有 $ m $ 个样本, $ n $ 表示有 $ n $ 个特征。 $ y_i ,i=1,2,..,m $ 表示样本类别,取值为 $ lbrace C_1, C_2,...,C_K brace $ 。
      先验概率为: $$ P(Y=C_k) ,k =1,2,...,K $$
      条件概率为(依据条件独立假设): $$ P(X=x|Y=C_k) = P(X_1=x_1,X_2=x_2,...,X_n=x_n|Y=C_k) = prod_{j=1}^n P(X_j=x_j|Y=C_k) $$
      则后验概率为: $$ P(Y=C_k|X=x) = frac{P(X=x|Y=C_k)P(Y=C_k)}{sum_k P(X=x|Y=C_k)P(Y=C_k)} $$
      将条件概率公式带入得: $$ P(Y=C_k|X=x) = frac{P(Y=C_k)prod_{j=1}^n P(X_j=x_j|Y=C_k)}{sum_k P(Y=C_k)prod_{j=1}^n P(X_j=x_j|Y=C_k)} $$
      上式为朴素贝叶斯分类的基本公式。于是,朴素贝叶斯分类器可表示为:

    [P(Y=C_k|X=x) = argunderbrace{max}_{C_k} frac{P(Y=C_k)prod_{j=1}^n P(X_j=x_j|Y=C_k)}{sum_k P(Y=C_k)prod_{j=1}^n P(X_j=x_j|Y=C_k)} ]

      由于分母对所有的 $ C_k $ 都是相同的,所以: $$ P(Y=C_k|X=x) = argunderbrace{max}{C_k} P(Y=C_k)prod{j=1}^n P(X_j=x_j|Y=C_k) $$


    3. 参数估计

    3.1 极大似然估计

      针对样本集我们可以利用极大似然估计计算出以下一些信息:

    [先验概率: P(Y=C_k)=frac{sum_{i=1}^m I(y_i = C_k)}{m} ,k = 1,2,...,K ]

      其中 $ sum_{i=1}^m I(y_i = C_k) $ 计算的是样本类别为 $ C_k $ 的总数。先验概率计算的是类别 $ C_k $ 在样本集中的频率。

    [条件概率: P(X_j = a_{jl}|Y=C_k) = frac{sum_{i=1}^m I(x_j^{(i)} = a_{jl},y_i=C_k)}{sum_{i=1}^m I(y_i=C_k)} ]

      其中第 $ j $ 个特征的取值可能是 $ lbrace a_{j1},a_{j2},...,a_{jh} brace $ ,共 $ h $ 个。该条件概率指的是,在样本类别为 $ C_k $ 的子样本集中,第 $ j $ 个特征取值为 $ a_{jl} $ 的样本的频率。

    3.2 贝叶斯估计

      为了弥补极大似然估计中可能出现概率值为0的情况(也就是某个事件出现的次数为0)。于是使用贝叶斯估计,如下:

    [先验概率: P(Y=C_k)=frac{sum_{i=1}^m I(y_i = C_k) + lambda }{m + K lambda } ,k = 1,2,...,K ]

      其中 $ K $ 为类别的个数。

    [条件概率: P(X_j = a_{jl}|Y=C_k) = frac{sum_{i=1}^m I(x_j^{(i)} = a_{jl},y_i=C_k) + lambda }{sum_{i=1}^m I(y_i=C_k) + S_j lambda } ]

      其中 $ S_j $ 为特征 $ X_j $ 取值的个数 $ h $ 。


    4. 朴素贝叶斯算法过程

      以参数估计为极大似然估计为例:
      样本集为:$$ D = lbrace (x_1^{(1)}, x_2^{(1)},...,x_n^{(1)},y_1),(x_1^{(2)}, x_2^{(2)},...,x_n^{(2)},y_2),...,(x_1^{(m)}, x_2^{(m)},...,x_n^{(m)},y_m) brace $$
      其中 $ y_i ,i=1,2,..,m $ 表示样本类别,取值为 $ lbrace C_1, C_2,...,C_K brace $ 。
      (1)计算先验概率:求出样本类别的个数 $ K $ 。对于每一个样本 $ Y=C_k $ ,计算出 $ P(Y=C_k) $ 。其为类别 $ C_k $ 在总样本集中的频率。
      (2)计算条件概率:将样本集划分成 $ K $ 个子样本集,分别对属于 $ C_k $ 的子样本集进行计算,计算出其中特征 $ X_j = a_{jl} $ 的概率: $ P(X_j=a_{jl}|Y=C_k) $。其为该子集中特征取值为 $ a_{jl} $ 的样本数与该子集样本数的比值。
      (3)针对待预测样本 $ x^{test} $ ,计算其对于每个类别 $ C_k $ 的后验概率:$ P(Y=C_k|X=x^{test}) = P(Y=C_k)prod_{j=1}^n P(X_j=x_j^{test}|Y=C_k) $ 。概率值最大的类别即为待预测样本的预测类别


    5. 朴素贝叶斯算法分析

      该小节参考博文[4]
      优点
        (1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
        (2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
        (3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
      缺点
        (1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
        (2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
        (3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
        (4)对输入数据的表达形式很敏感。


    引用及参考:
    [1] 《统计学习方法》李航著
    [2] 《机器学习实战》Peter Harrington著
    [3] 《机器学习》周志华著
    [4] https://www.cnblogs.com/pinard/p/6069267.html
    [5] https://blog.csdn.net/zengxiantao1994/article/details/72787849
    [6] https://www.cnblogs.com/csguo/p/7804355.html

    写在最后:本文参考以上资料进行整合与总结,属于原创,文章中可能出现理解不当的地方,若有所见解或异议可在下方评论,谢谢!
    若需转载请注明https://www.cnblogs.com/lliuye/p/9178090.html

  • 相关阅读:
    bat学习
    Eclipse调试方法及快捷键
    JDK中的设计模式
    开源-自由-乔布斯
    AOP
    编程语言
    [LeetCode] 160. Intersection of Two Linked Lists(两个单链表的交集)
    [LeetCode] 198. House Robber(小偷)
    [LeetCode] 155. Min Stack(最小栈)
    [LeetCode] 1. Two Sum(两数之和)
  • 原文地址:https://www.cnblogs.com/lliuye/p/9178090.html
Copyright © 2011-2022 走看看