参考李航《统计学习方法》,列出一个自制的简单的数据集,描述朴素贝叶斯算法的原理。
一步步往下读,很好理解这个算法!
以一个简易数据集为例:
脸-X(1) | 胸-X(2) | 腿-X(3) | 追不追-Y |
美 | 大 | 长 | 追 |
美 | 小 | 长 | 追 |
美 | 大 | 短 | 追 |
美 | 小 | 短 | 不追 |
丑 | 大 | 长 | 追 |
丑 | 小 | 长 | 不追 |
丑 | 大 | 短 | 不追 |
丑 | 小 | 短 | 不追 |
这里输入值 X 为一个 3 维向量,输出值 Y 包含两种 label,训练集有 8 组。
我们最终预测 X = [美,大,长] 时,计算要追和不要追的概率,求得最后的结果。
很容易根据训练集得到先验概率 P(Y = ci), i = 1, 2, ……, k
示例当中的数据进行统计得到的先验概率分布为:P("追不追" = "追") = 4 / 8,P("追不追" = "不追") = 4 / 8。
P(B | A) : 表示 A 发生的前提下,B 发生的概率
P(B | A) 中,A 为结果,B为原因,即为后验概率(关于先验概率、后验概率,有兴趣的可以查资料了解一下,不过在这里完全可以无视两者在概念上的区别)
这里后验条件概率分布定义为 P(X = x | Y = ci) = P(X(1) = x(1), X(2) = x(2), ……, X(n) = x(n) | Y = ci), i = 1, 2, ……, k
简单点说,例如当追/不追时,X = [美,大,长] 的概率分别表示为:
即当我追/不追一个女生,这个女生同时满足脸美、胸大、腿长的概率是多少。
那么这个概率怎么计算呢?
这里就涉及到这个算法的核心的假设:
这里就不上公式了,直接用例子说明。
我们假设这个姑娘脸的美丑,胸的大小,腿的长短,三者是互不相关的,那么我们上面的条件概率分布就可以改写为:
这个假设可能与现实情况并不完全吻合,会带来一些误差,但是基于这个假设,这个算法具备了更强的可计算性,而且实际应用来看,这个误差的影响并没有大到影响朴素贝叶斯算法的应用。
这里要引出贝叶斯公式:P(A | B) * P(B) = P(B | A) * P(A)
其实很好理解,等式两边表示的都是 A 、B 同时发生的概率。
翻转一下即得到了一个求条件概率的公式:P(A | B) = P(B | A) * P(A) / P(B)
回到我们的例子,当 X = [美,大,长] 时,追的概率为:
P(Y = "追" |X = [美,大,长] ) = P(X = [美,大,长] | Y = "追") * P(Y = "追") / P(X = [美,大,长])
根据前面叙述的条件独立假设,这个式子可以改写为:
P(Y = "追" |X = [美,大,长] ) = 【 P("脸" = "美" | Y = "追" ) * P("胸" = "大" | Y = "追") * P("腿" = "长" | Y = "追") * P(Y = "追") 】/ 【 P("脸" = "美") * P("胸" = "大") * P("腿" = "长") 】
同理,当 X = [美,大,长] 时,不追的概率为:
P(Y = "不追" |X = [美,大,长] ) = 【 P("脸" = "美" | Y = "不追" ) * P("胸" = "大" | Y = "不追") * P("腿" = "长" | Y = "不追") * P(Y = "不追") 】/ 【 P("脸" = "美") * P("胸" = "大") * P("腿" = "长") 】
这里注意到两个公式的分母是一样的,于是只需比较分子的结果即可判定:
P(Y = "追" |X = [美,大,长] ) 的分子为:
P("脸" = "美" | Y = "追" ) * P("胸" = "大" | Y = "追") * P("腿" = "长" | Y = "追") * P(Y = "追")
P(Y = "不追" |X = [美,大,长] ) 的分子为:
P("脸" = "美" | Y = "不追" ) * P("胸" = "大" | Y = "不追") * P("腿" = "长" | Y = "不追") * P(Y = "不追")
那么这些概率如何计算呢?
以一个简单易懂的方法为例:
直接根据训练集数据,计算统计结果,作为对真实概率的近似:
"追"的分子计算得到 27/128 ,"不追"的分子为 1/128,根据后验概率最大化,取结果为"追"。
注意这里只是近似,不是真实的概率。
另一个更优的方法是贝叶斯估计,贴公式不太方便,原理也很简单,这里就不赘述了。