跳转至

朴素贝叶斯

贝叶斯理论

给定一个假设Hypothesis, H和证据Evidence, E. 那么在出现了证据E的情况下, H的概率为\(P(H|E)=\frac{P(E|H)P(H)}{P(E)}\).

如给出一捆花🌷, 🌹, 🌸的一些特征即证据E, 如颜色, 茎长. 推测假设H是一朵玫瑰🌹的可能性:

  • \(P(H|E)\): 后验概率, 又叫作条件概率, 是我们知道证据后某一事件的可能性, 如给出颜色, 茎长后, 是玫瑰的概率
  • \(P(H)\): 先验概率, 是我们知道证据前某一事件的可能性, 如不给出任何颜色, 茎长, 是玫瑰的概率
  • \(P(E|H)\): 后验概率, 又叫作条件概率, 是我们知道证据后某一事件的可能性, 如玫瑰之后, 是红色, 长茎的概率
  • \(P(E)\): 先验概率, 是我们知道证据前某一事件的可能性, 如不给出是不是玫瑰, 是红色, 长茎的概率

朴素贝叶斯算法

朴素贝叶斯算法用于解决分类问题, 依赖的是贝叶斯理论, 在这个基础上还包含了两层假设:

  1. 独立性: 在知道所属类的情况下, 所有的属性(特征)两两之间都是独立的, 即假设我们有两个属性A和B, 他们用于预测某个类别C, 如果属性A和属性B是独立的, 那么在给定类别C的情况下, 属性A的取值不会影响属性B的取值. 即\(P(A,B|C)=P(A|C)\times P(B|C)\)
  2. 同等重要: 所有的属性都是同等重要的

从这里, 我们可以看出, 朴素贝叶斯算法之所以被称为"朴素", 或者"天真", 是因为它的假设基本上都是天真的, 不实际的, 但是这些假设能够使算法更加简单, 并且往往能够取得较好的结果.

假设我们有一些天气数据, 从这些数据(证据)中推导出假设"能玩游戏"还是"不能玩游戏":

outlook temp. humidity windy play
sunny hot high false no
sunny hot high true no
overcast hot high false yes
rainy mild high false yes
rainy cool normal false yes
rainy cool normal true no
overcast cool normal true yes
sunny mild high false no
sunny cool normal false yes
rainy mild normal false yes
sunny mild normal true yes
overcast mild high true yes
overcast hot normal false yes
rainy mild high true no

首先, 需要计算在已知特征的情况下, 假设新的一天的天气为sunny, cool, high, true, 分别对应\(E_1, E_2, E_3, E_4\), 对于每一个类(假设)都要计算他们的后验概率, 如在这个例子中, 是\(P(yes|E)\)\(P(no|E)\). 根据贝叶斯理论, \(P(yes|E)=\frac{P(E|yes)P(yes)}{P(E)}, P(no|E)=\frac{P(E|no)P(no)}{P(E)}\). 那么, 我们如何计算\(P(E|yes)\)\(P(E|no)\)呢? 这里, 我们就用到了假设1, 即\(P(E|yes)=P(E_1|yes)P(E_2|yes)P(E_3|yes)P(E_4|yes)\), \(P(E|no)=P(E_1|no)P(E_2|no)P(E_3|no)P(E_4|no)\). 代入上面的式子, 可以得到\(P(yes|E)=\frac{P(E_1|yes)P(E_2|yes)P(E_3|yes)P(E_4|yes)P(yes)}{P(E)}, P(no|E)=\frac{P(E_1|no)P(E_2|no)P(E_3|no)P(E_4|no)P(no)}{P(E)}\). 分子的部分可以直接从训练数据中得到, 分母的部分都是\(P(E)\), 由于我们只是要比较\(P(yes|E)\)\(P(no|E)\), 所以没有必要算出分母, 具体的计算过程就不在这里写了, 得到的结果是\(P(yes|E)=\frac{0.0053}{P(E)}, P(no|E)=\frac{0.0206}{P(E)}\). 由于\(P(no|E)>P(yes|E)\), 所以朴素贝叶斯预测的sunny, cool, high, true的play选项为no.

另一个例子见.

零频问题

在上述分类问题中, 对于一个属性值(特征值)至少在每一个类别(play=yes, play=no)中都出现过一次. 如果sunny只出现在play=no中, 从未出现在play=yes中, 那么, 就会有\(P(yes|E)=\frac{P(E_1|yes)P(E_2|yes)P(E_3|yes)P(E_4|yes)P(yes)}{P(E)}=0\), 因为\(P(E_1|yes)=0\). 这意味着任何含有属性值为sunny的天气情况都会被归类到play=no, 完全忽略其他值的影响.

为了解决这个问题, 需要用到拉普拉斯平滑技术: 在计算\(P(E_i|yes)\)的时候, 用到以下公式, \(P(E_i|yes)=(count(E_i)+1)/(count(yes)+m)\), 对于\(P(E_i|no)\)也是同样的, 其中\(m\)为该属性\(E_i\)可能取值的数量, 如对于outlook, 可能的取值有\(3\)种, 当零频的时候, \(count(E_i)\)等于\(0\).

缺失值问题

两种情况, 新样本中某些属性缺失, 不要在计算p(E|yes)计算p(E|no)的时候包括那个缺失值的属性, 如没有outlook则不要包含\(p(outlook|yes)\)\(p(outlook|no)\); 表中的某些属性值缺失, 则不要将缺失值纳入计数, 如在yes下, outlook列中有一个缺失值, 则直接跳过, 不用管.

数值属性朴素贝叶斯

现在, 试想如果温度和湿度是数值的话, 如何对play的结果做出分类呢?

即我们如何计算\(P(E_1|yes)\), \(P(E_2|yes)\), \(P(E_1|no)\), ...? 我们假设数值符合正态分布或者高斯分布, 以正态分布为例, 使用概率函数, 参数为期望\(\mu\)和标准差, standard deviation \(\sigma\): \(f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}\). 其中期望\(\mu=\frac{\sum_{i=1}^n x_i}{n}\), 标准差\(\sigma=\sqrt{\frac{\sum_{i=1}^n(x_i-\mu)^2}{n-1}}\).

以属性温度为例, 温度是一个连续的值, 我们可以将某一个温度的概率密度作为乘子. 如\(f(temp=66|yes)=\frac{1}{6.2\sqrt{2\pi}}e^{-\frac{(66-73)^2}{2\times 6.2^2}}\), 其中\(\mu=73\), 表示气温在分类为yes下的期望(均值), \(\sigma=6.2\), 表示气温在分类为yes下的标准差.

其他类似, 有了这些值, 就可以计算\(P(yes|E)=\frac{\frac{2}{9}\times 0.034\times 0.0221\times \frac{3}{9}\times\frac{9}{14}}{P(E)}=\frac{0.000036}{P(E)}\), \(P(no|E)=\frac{\frac{3}{5}\times 0.0279\times 0.038\times \frac{3}{5}\times\frac{5}{14}}{P(E)}=\frac{0.000137}{P(E)}\), 得到\(P(no|E)>P(yes|E)\), 所以预测的分类为play=no.