之前,我探讨过“决策树归纳”的分类方法(详见:决策树归纳),本文我将介绍另一中比决策树更加简单的,用概率方法分类的技术——“朴素贝叶斯分类”。
贝叶斯定理
贝叶斯定理是概率论中非常简单基础的定理,其解决的核心点在于根据已有信息,对未知事物发生结果的概率计算。就拿分类这件事来说(分类的相关概念我已经在上一篇博文:决策树归纳中说得相当清楚,故不再赘述),如果现在有一个数据对象
与此同时,用符号
条件概率
至此,明白了这些概念,可以引入贝叶斯定理了。首先先提一下概率论中著名的条件概率公式。设
意思非常容易理解,在已知
-
A :至少有一个是女孩 -
B :至少有一个是男孩
而如果直接计算
乘法公式
我们可以将条件概率公式变形,这就得到了乘法公式:
全概率公式
再拓展一步,假设样本空间
上面这个公式也就是所谓的全概率公式。
贝叶斯公式
最后根据乘法公式和全概率公式,可以最终得到贝叶斯公式:
实际上,贝叶斯公式是做了一个转换,将
朴素贝叶斯分类
在介绍具体的分类算法前,先给出符号说明:
-
D :训练集,由训练元组构成,对于其中一个训练元组X 来说,X 由m 个属性值构成:X={x1,x2,…,xm} ; -
Ak :元组中第k 个属性的属性名; -
Ci :第i 个类的类标记,这里记类的总数为n ;
具体算法其实只有一步,如下:
输入:训练集,新的数据对象
输出:预测
过程:对于所有类别,依次计算概率
这个道理太过明显了,就是找分类中,概率最大的。但是计算
P(X) 表示选择一个数据对象,恰好是X 的概率,这个概率对于所有类别都是一样的,所以,既然我们是要比较大小,就可以不用考虑了。P(Ci) 表示假设H 成立的先验概率,即一无所知的情况下,一个数据对象属于类Ci 的概率。若当前已有训练数据集,则用|Ci||D| 来估计P(H) ;若当前还没有训练集,则令P(Ci)=1/n ,其中,n 为所有类别的的个数,即认为分配到每个类的概率都是相等的。P(X|Ci) 的计算相对要复杂一点,它表示被归类为Ci 的元组,就是要预测的元组X 的概率。所以从含义也能看出P(X|Ci) 可以用X 在类Ci 中的比例来估计。当需要处理的是属性值非常多的数据集时,直接比较计算会导致运算效率较低。因此,一般情况下会默认属性之间是相互独立的,然后用下面的公式计算:P(X|Ci)=∏k=1mP(Xk|Ci)=P(X1|Ci)P(X2|Ci)⋯P(Xm|Ci) (1)
其中,P(Xk|Ci) 表示类Ci 的所有元组中,第k 个属性的值是Xk 的元组出现的概率。注意:显然,做出这种属性相互独立的假设可能会在某些情况下是不那么合理的。之所以还要用这样连乘的形式处理,而不是直接统计
X 在类Ci 中的比例来用作估计的概率P(X|Ci) ,据韩家炜《数据挖掘》中的说法,是为了降低计算开销,然而我个人认为这两种运算的方法至少在属性都是“离散”的情况下是一致的,都是O(m|Ci|) ,其中m 为属性总数。所以,我猜测这样处理的理由在于以下两点:- 解决了元组中含有连续型属性时,概率估计问题(这一点下面会说)
- 解决了在训练集中不存在
X 时的概率估计问题。这一点比较好理解,可以想象这样一种情形:X 在Ci 中并不存在,但是X 的每个属性值在Ci 中都存在,总不能说P(X|Ci)=0 吧,所以可以用上式估计。
好了,现在可以计算
P(Xk|Ci) 了,正如上面分析的那样,分两种情况考虑:-
Xk 是离散属性,这种情况简单,直接使用比例|Xk||Ci| 估计即可。|Xk| 表示类Ci 的元组中,属性Ak 的属性值为Xk 的元组个数; -
Xk 是连续属性,这种情况复杂一点,我们首先假设Xk 在Ci 中是符合均值为μ ,标准差为σ 的正态分布,用其概率密度函数的值,估计概率,具体如下:
P(Xk|Ci)=12π−−√σe−(Xk−μ)22σ2
其中,μ ,σ 表示Ci 的元组中,属性Ak 的的均值和标准差。
这样,整个计算过程完成。从计算过程能够看出,这样设计的
实例计算
我用上一篇博文(详见:决策树归纳)中的例子来展示一下上面所说的计算过程。这个例子说的是对用户是否买电脑的类别判断,训练集(属性及类标记)如下表所示:
RID | student | income | age | credit_rating | class |
---|---|---|---|---|---|
1 | no | high | youth | fair | no |
2 | no | high | youth | excellent | no |
3 | no | high | middle_aged | fair | yes |
4 | no | medium | senior | fair | yes |
5 | yes | low | senior | fair | yes |
6 | yes | low | senior | excellent | no |
7 | yes | low | middle_aged | excellent | yes |
8 | no | medium | youth | fair | no |
9 | yes | low | youth | fair | yes |
10 | yes | medium | senior | fair | yes |
11 | yes | medium | youth | excellent | yes |
12 | no | medium | middle_aged | excellent | yes |
13 | yes | high | middle_aged | fair | yes |
14 | no | low | senior | excellent | no |
假设现在要判断一个新的数据对象X = {age=youth; income=medium; student=yes; credit_rating=fair}属于哪一类。
根据上面的步骤:
-
P(X) 可忽略,不考虑; -
P(class=yes)=9/14=0.643 ;P(class=no)=5/14=0.357 ; 既然是两类,那么需要计算两个概率,进行比较:
(1)计算:
P(X|class=yes) P(X|class=yes)=P(age=youth|class=yes)×P(income=medium|class=yes)×P(student=yes|class=yes)×P(credit_rating=fair|class=yes)=2/9×4/9×6/9×6/9=0.044 (2)计算:
P(X|class=no) 具体过程不写出来了,与上面类似。最终计算得到
P(X|class=no)=0.019 比较大小:
P(X|class=yes)P(class=yes)=0.044×0.643=0.028
P(X|class=no)P(class=no)=0.019×0.357=0.007 所以,
X 应该归类为买电脑的一类(class=yes)。
拉普拉斯校准
在上面介绍的朴素贝叶斯分类算法中,存在一种极端的情况:那就是在计算概率
为了避免这种极端的不合理的情况,我们可以采取“拉普拉斯校准”的方法。基本思路是对每个属性值对应的元组个数加1,假设现在有
这样,既不会太过大地影响比例计算的最终结果,同时,也避免了0概率的情况发生。
这就是朴素贝叶斯分类的基本介绍了。不足之处,还请指正!