一 、朴素贝叶斯算法概述
前面我们讲过KNN分类算法和决策树分类算法,两者最终都是预测出实例的确定的分类结果,但是,有时候分类器会产生错误结果;本章要学的朴素贝叶斯分类算法则是给出一个最优的猜测结果,同时给出猜测的概率估计值。
朴素贝叶斯对一个测试样本分类时,通过比较p(y=0|x)和p(y=1|x)来进行决策。这里注意涉及两个重点,一个是贝叶斯公式:p(y=1|x)=p(x|y=1)p(y=1)p(x)p(y=1|x)=p(x|y=1)p(y=1)p(x),其中x是一个多维向量,x=(x1,x2,…,xn)x=(x1,x2,…,xn),则p(x|y)=p(x1|y)p(x2|y,x1)p(x3|y,x1,x2)…p(xn|y,x1,x2,…,xn?1)p(x|y)=p(x1|y)p(x2|y,x1)p(x3|y,x1,x2)…p(xn|y,x1,x2,…,xn?1)。这个式子如此多的条件概率,可没法求呀。那么就限定一下条件,使得特殊情况下可以求解,于是就有了下面这个很Naive的假设:在给定类别y的条件下,xi(i=1,2,…,n)xi(i=1,2,…,n)直接相互独立。
这个假设表达的意思是在每个类别内部,特征x的每一维与其他维没有关系,需要注意的是此条件独立并不等价于完全独立。这个假设的直观表达是:p(xi|y,xj)=p(xi|y,xj)(alli≠j)p(xi|y,xj)=p(xi|y,xj)(alli≠j),基于此假设,上面的公式就可写成:p(x|y)=p(x1|y)p(x2|y)p(x3|y)…p(xn|y)=∏i=1np(xi|y)p(x|y)=p(x1|y)p(x2|y)p(x3|y)…p(xn|y)=∏i=1np(xi|y)
对于一个训练样本集合{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))},x(i)=(x(i)1,x(i)2,...,x(i)n)x(i)=(x1(i),x2(i),...,xn(i)),ni=∑nj=1x(i)jni=∑j=1nxj(i),其似然函数为:
L=∏i=1mp(x(i),y(i))=∏i=1mp(x(i)|y(i))p(y(i))=∏i=1m∏j=1nip(x(i)j|y(i))p(y(i))L=∏i=1mp(x(i),y(i))=∏i=1mp(x(i)|y(i))p(y(i))=∏i=1m∏j=1nip(xj(i)|y(i))p(y(i))
与高斯判别分析中的推导类似,对似然函数取对数并最大化,通过求导可求解出:
?k|y=1=p(x(i)=k|y=1)=∑mi=1∑nij=1I(x(i)j=kandy(i)=1)∑mi=1I(y(i)=1)ni?k|y=1=p(x(i)=k|y=1)=∑i=1m∑j=1niI(xj(i)=kandy(i)=1)∑i=1mI(y(i)=1)ni
?k|y=0=p(x(i)=k|y=0)=∑mi=1∑nij=1I(x(i)j=kandy(i)=0)∑mi=1I(y(i)=0)ni?k|y=0=p(x(i)=k|y=0)=∑i=1m∑j=1niI(xj(i)=kandy(i)=0)∑i=1mI(y(i)=0)ni
?y=p(y=1)=∑mi=1I(y(i)=1)m?y=p(y=1)=∑i=1mI(y(i)=1)m ,式中I为指示函数。
另一个重点就是:拉普斯平滑
对于上面推导的公式,假设xixi的理论取值范围是0~99,但我们的训练样本中,没有任何一个样本中出现过99这个值,那么按照上面贝叶斯公式计算,会出现0/0的情况。基于这一点,对上面公式做一点修正,如下所示:?k|y=1=p(xi=k|y=1)=∑mi=1∑nij=1I(x(i)j=kandy(i)=1)+1∑mi=1I(y(i)=1)ni+N?k|y=1=p(xi=k|y=1)=∑i=1m∑j=1niI(xj(i)=kandy(i)=1)+1∑i=1mI(y(i)=1)ni+N
?k|y=0=p(xi=k|y=0)=∑mi=1∑nij=1I(x(i)j=kandy(i)=0)+1∑mi=1I(y(i)=0)ni+N?k|y=0=p(xi=k|y=0)=∑i=1m∑j=1niI(xj(i)=kandy(i)=0)+1∑i=1mI(y(i)=0)ni+N
式中N即是xixi理论取值数。如此修正意义何在?做上述修正,对于理论上可能存在的状态,基本其多次试验没有发生,但我们也不否认其存在的可能性,只是认为其出现的可能性很小而已。一个直观的例子,我们都知道抛硬币正反面的概率都为0.5,但你抛100次却每次都是正面,即便如此相信你也不会认为抛出反面的概率是0吧?不过出现如此现象则可能让我怀疑此硬币设计有什么问题导致出现反面的概率如此之低。
二、算法伪代码:
整个算法可以分为两个部分,“建立模型”与“进行预测”,其建立模型的伪代码如下:
预测的伪代码如下:
三、算法小结
朴素贝叶斯那个很朴素的假设是条件独立而非独立,这一点必须要明确。实际上这是一个强假设,大多情况下问题不满足该假设却表现良好,这也算贝叶斯理论的一个特色。算法计算了样本类别的先验分布,因此训练集正负样本数量需要符合其先验分布,这一点与GDA是类似。更进一步,所有的生成学习算法都要计算先验概率,故而对训练样本都有类似的要求。
本文是系列文,会完整记录自己学习《机器学习》这本书的心得体会,喜欢的同学可以敬请期待!