机器学习(五):朴素贝叶斯算法(非连续变量)
一,朴素贝叶斯算法
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。最广泛的两种分类模型是决策树模型Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。
和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。
理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。
算法步骤
- 收集数据
- 准备数据:需要数值型或者布尔型数据,如果是文本文件,需要解析成词条向量
- 分析数据:有大量特征时,用直方图分析效果更好
- 训练算法:计算不同的独立特征的条件概率
- 测试算法:计算错误率
- 使用算法:一个常见的朴素贝叶斯应用是文档分类。
对于非连续变量的朴素贝叶斯
在这一节当中,会来实现非连续变量的朴素贝叶斯算法,会使用文本数据为例子。我们来看一下公式推导:
我们可以从条件概率的定义推导出贝叶斯定理。根据条件概率的定义,在事件B发生的条件下事件A发生的概率为:
P(A∣B)=P(A⋂B)P(B) P(A|B)=\frac{P(A\bigcap B)}{P(B)}P(A∣B)=P(B)P(A⋂B)
同样的,在事件A发生的条件下时间B发生的概率为:
P(A∣B)=P(A⋂B)P(A) P(A|B)=\frac{P(A\bigcap B)}{P(A)}P(A∣B)=P(A)P(A⋂B)
结合这两个方程式,我们可以得到:
P(A∣B)P(B)=P(A⋂B)=P(B∣A)P(A) P(A|B)P(B)=P(A\bigcap B)=P(B|A)P(A)P(A∣B)P(B)=P(A⋂B)=P(B∣A)P(A)
这个引理有时候称作概率乘法规则,上式俩边同时除以P(A),若P(A)是非零的,我们可以得到贝叶斯定理:
P(B∣A)=P(A∣B)P(B)P(A) P(B|A)=\frac{P(A|B)P(B)}{P(A)}P(B∣A)=P(A)P(A∣B)P(B)
是不是还是有点蒙蔽,我们用一个实例看看:
某个医院早上来了六个门诊的病人,他们的情况如下表所示:
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
根据贝叶斯定理:
P(B∣A)=P(A∣B)P(B)P(A) P(B|A)=\frac{P(A|B)P(B)}{P(A)}P(B∣A)=P(A)P(A∣B)P(B)
可得
P(感冒∣打喷嚏χ建筑工人)=P(打喷嚏χ建筑工人∣感冒)P(感冒)P(打喷嚏χ建筑工人) P(感冒|打喷嚏\chi 建筑工人)=\frac{P(打喷嚏\chi 建筑工人|感冒)P(感冒)}{P(打喷嚏\chi 建筑工人)}P(感冒∣打喷嚏χ建筑工人)=P(打喷嚏χ建筑工人)P(打喷嚏χ建筑工人∣感冒)P(感冒)
根据朴素贝叶斯条件独立性的假设可知,"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了
P(感冒∣打喷嚏χ建筑工人)=P(打喷嚏∣感冒)P(建筑工人∣感冒)P(感冒)P(打喷嚏χ建筑工人) P(感冒|打喷嚏\chi 建筑工人)=\frac{P(打喷嚏|感冒)P(建筑工人|感冒)P(感冒)}{P(打喷嚏\chi 建筑工人)}P(感冒∣打喷嚏χ建筑工人)=P(打喷嚏χ建筑工人)P(打喷嚏∣感冒)P(建筑工人∣感冒)P(感冒)
可以计算出来:
P(感冒∣打喷嚏χ建筑工人)=0.66χ0.33χ0.50.5χ0.33=0.66P(感冒|打喷嚏\chi 建筑工人)=\frac{0.66 \chi 0.33 \chi 0.5}{0.5 \chi 0.33} = 0.66P(感冒∣打喷嚏χ建筑工人)=0.5χ0.330.66χ0.33χ0.5=0.66
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上