“文章原创,转载请注明出处”
0、kNN算法的优缺点
与kNN算法一样,朴素贝叶斯算法也是数据挖掘十大算法之一。我们介绍kNN算法时,并没有讨论kNN算法的优缺点,这边首先看看这个问题。
从构造kNN算法的过程可以看到,这个分类算法的精度很高。因为这个算法计算了所有点与待分类点之间的相似度,然后去确定带分类点的类别。由此可见,这个算法对异常值并不敏感。但是正是因为它需要计算所有点之间的距离,所以其复杂度是很高的,换句话就是,如果数据量大的话,这个算法会很费时,并不高效。
一、贝叶斯决策
贝叶斯定理给出了条件概率之间的关系,是一个非常重要的定理。这里直接给出贝叶斯定理的结论:
在贝叶斯决策理论里面,要判断点 x 是否属于 Ci 类,只要验证是否存在:
即是,使得 p(Ci∣x) 达到最大的那个 Ci 就是 x 所属的类别。
二、具体流程
要计算 P(Ci∣x) ,那么就需要计算 P(x∣Ci)P(Ci)P(x) ,我们知道对于每一个 P(Ci∣x) ,其计算公式中的分母都是 P(x) ,所以有:
所以我们实际计算时,只需要考虑上式右侧的大小即可。首先我们来确定一些符号的意思:
- x=[x1,x2,…,xp] 为一个带分类的项, xi 为其特征;
- data表示一个已知分类的数据集( n×p 的矩阵),其每一行代表一个观测,每一列代表一个特征;
- label表示data中每一个数据对应的类别标签( n×1 的矩阵),比如data的第一行观测的类别就是label中的第一个取值;
- C=[C1,C2,…,Cm] 为一个类别集合,一般来说 m<p 。
步骤:
-
在已知分类的数据集data中统计:
P(Ci),i=1,2,…,mP(xj∣Ci),i=1,2,…,m;j=1,2,…p -
计算
P(x∣Ci)P(Ci)=P(Ci)∏j=1pP(xj∣Ci),i=1,2,…,m -
若
P(x∣Ck)P(Ck)=max{P(x∣Ci)P(Ci)}则 x∈Ck 。
三、一些存在的问题
- 当步骤的第2步中, P(x∣Ci)P(Ci)=P(Ci)∏pj=1P(xj∣Ci),i=1,2,…,m ,中 P(xj∣Ci) 可能在样本较小时取值出现0,那么就会影响乘积;
- 计算机计算时会出现精度问题,比如,如果 P(xj∣Ci) 的值有很多都是非常小的(像0.000001),那么计算机在计算是会将其四舍五入成0。
出现上面的情况应该怎么办呢?
学数学的应该都清楚,遇到这种问题有一个很简单的处理方式,那就是取个对数。虽说取对数后会改变值的大小,但是取对数不会改变原本数据趋势,即原来大的数,取对数后还是大的。
此外,对于 P(xj∣Ci) 可能在样本较小时取值出现0的情况,处理也很简单,那就是将每一个 xj 的初值都设置成1,所有特征的基数都从1开始,不会影响结果。(这时需要注意,所有特征的初值都是1,对应的总数初值也会发生变化。)
四、R语言实现
见我的项目