纠结了好一阵这一节写哪一个算法,最后决定先把容易写的给总结出来。朴素贝叶斯,我们从名字上就可以明显感觉到这是和概率有着很大关系的一个算法。我们在这里只谈二分类的问题,我觉得如果你会通过贝叶斯解决二分类问题,那多分类问题也不是一件难事了。
P(Y,X)=P(Y|X)×P(X)=P(X|Y)×P(Y) ,这个就是传说中的贝叶斯公式。
你可能会说:如果告诉我这个样本属于各个类别的概率,我找到那个概率最大的,然后我就可以很响亮的说这个样本是属于这个类别的了。朴素贝叶斯就是这个么做的,它算出这个样本属于各个类别的概率,然后找到概率最大的那个类别作为输出。我们用概率化的语言去解释:这个样本最有可能属于这个类别,所以我们认为这个样本的类别就是这个概率最大的类别。贝叶斯的做法和我们直觉上的思路是一致的。
假设现在有一个样本 X=[x1,x2,....xn] (这里[ ]里面的是这个样本X的n个特征),这个样本可能属于+1或者-1类。我们要去判断这个样本属于哪一类?你会怎么做?
你可能会去求样本X属于+1类别的概率。这个怎么表述出来呢?我们用这么一个式子去描述 P(Y=+1∣X=[x1,x2,....xn]) ,解释为:在已知 X=[x1,x2,....xn] 的前提下,Y=+1出现的概率是多少。
可能会有人会有疑惑这个概率为什么不是 P(Y=+1,X=[x1,x2,....xn]) 这个呢?我在刚开始看贝叶斯的时候也在疑惑这个问题, P(Y=+1,X=[x1,x2,....xn]) 这个表示的意思是: X=[x1,x2,....xn] 和Y=+1同时发生的概率,这个感觉上不就是样本X属于+1类别的概率么? P(Y=+1,X=[x1,x2,....xn]) 和 P(Y=+1∣X=[x1,x2,....xn]) 到底有什么区别的呢?我们通过贝叶斯公式展开 P(Y=+1,X=x1,x2,....xn])=P(Y=+1∣X=[x1,x2,....xn])×P(X=[x1,x2,....xn])
这个时候我们可以看到那个联合概率是条件概率和 P(X=[x1,x2,....xn]) 的乘积,我们可以直观的看出来联合概率和条件概率的区别: X=[x1,x2,....xn] 到底是已知还是未知的?如果是已知的话,就是条件概率;如果是未知的话,就是联合概率(公式中可以看到,它多乘了一项 P(X=[x1,x2,....xn]) )。我们现在是已经知道 X=[x1,x2,....xn] ,去求X属于+1类别的概率,所以它是一个条件概率。当你分不清这个概率什么意思的时候,把公式写出来,这个过程可能会帮助到你。
如果你很清楚上面所说的内容,那么就可以很愉快的告诉你,你一定会理解朴素贝叶斯算法的,放轻松,继续看下去就行了。关于上面说的内容,如果有疑惑的话,我觉得应该先把疑惑解决掉,再继续你前进的步伐。清楚为什么你要这么做!!!!
我们在1里面已经说了,要先去求 P(Y=+1∣X=[x1,x2,....xn]) ,问题来了怎么求?
我们可以用贝叶斯公式对这个条件概率进行形式上的变化。
P(Y=+1∣X=[x1,x2,....xn])=P(Y=+1,X=[x1,x2,....xn])P(X=[x1,x2,....xn])=P(X=[x1,x2,....xn]∣Y=+1)×P(Y=+1)P(X=[x1,x2,....xn])利用贝叶斯公式
我们在这里可以发现我们还是不容易求出这个概率到底是多少。所以朴素贝叶斯做了一个很强的假设:假设X的各个特征是相互独立的。意思就是样本的每个特征和其他特征都是完全没有关系的,没有相关性的。这是一个不讲道理的假设,不过通过这个假设可以让朴素贝叶斯算法非常的简洁高效,也正是因为这个假设,所以才在贝叶斯前面加上朴素两个字。
现在接着上式把这个假设代入进去:
=P(Y=+1)×∏i=ni=1P(Xi=xi∣Y=+1)P(X=[x1,x2,....xn])根据特征相互独立把P(X=[x1,x2,....xn]∣Y=+1)分解成连乘=P(Y=+1)×∏i=ni=1P(Xi=xi∣Y=+1)P(Y=+1)×∏i=ni=1P(Xi=xi∣Y=+1)+P(Y=−1)×∏i=ni=1P(Xi=xi∣Y=−1)对分母进行分解
我们在这里通过极大似然估计去计算这里面的每一项的概率值。(我们会在最后介绍极大似然估计)
P(Y=+1) 是训练集中+1类别的样本出现的概率,用类别+1的样本个数除以训练集的样本总数。
P(Y=−1) 同样的求法。
P(Xi=xi∣Y=+1) 是类别为+1的样本中 Xi=xi 出现的概率,用类别为+1并且的样本第i个特征是 xi 的样本数量除以类别为+1的样本个数。 P(Xi=xi∣Y=+1)=P(Xi=xi,Y=+1)P(Y=+1)=#(Xi=xi,Y=+1)#(Y=+1)#代表个数
P(Xi=xi∣Y=−1) 同样的求法。
这些都是很基本的概率计算。
从(1)中的推导可以得到
P(Y=+1∣X=[x1,x2,....xn])=P(Y=+1)×∏i=ni=1P(Xi=xi∣Y=+1)P(Y=+1)×∏i=ni=1P(Xi=xi∣Y=+1)+P(Y=−1)×∏i=ni=1P(Xi=xi∣Y=−1)
P(Y=−1∣X=[x1,x2,....xn])=P(Y=−1)×∏i=ni=1P(Xi=xi∣Y=−1)P(Y=+1)×∏i=ni=1P(Xi=xi∣Y=+1)+P(Y=−1)×∏i=ni=1P(Xi=xi∣Y=−1)
我们会计算这两个概率分别是多少,找到较大的那一个。我们可以发现这两个式子中的分母是一样的,不会影响到这两个概率的大小关系,所以我们只需要直接比较这两个式子的分子大小即可。
P(Y=+1)和P(Xi=xi∣Y=+1) 可能会出现为0的情况,现在假设训练集中就真没有-1类别的样本,那么我们通过上面的计算方法进行计算就会得到 P(Y=−1)=0 。这个时候就要考虑了:在(2)中所写的公式会出现分母为0的情况,还有就是类别为-1的概率真的是0么?这时就需要加入拉普拉斯平滑了。
令
P(Xi=xi∣Y=+1)==#(Xi=xi,Y=+1)+λ#(Y=+1)+Kλλ>0,通常我们令λ=1。K表示样本的第i个特征总共有K种可能性
为什么要这么做?
这么做可以保证两点:
第一: P(Xi=xi∣Y=+1)>0
第二: ∑Kl=1P(样本的第i个特征为xil∣Y=+1)=1
xil表示第i个特征的第l种可能性,l=[1,2...K]。
我觉得有必要举个例子了。
假设现在样本的第i个特征有5种可能:1,2,3,4,5,
我们就令K=5,通过拉普拉斯平滑,我们可以有以下保证:
P(Xi=1|Y=+1)>0,P(Xi=2|Y=+1)>0,P(Xi=3|Y=+1)>0,P(Xi=4|Y=+1)>0,P(Xi=5|Y=+1)>0P(Xi=1|Y=+1)+P(Xi=2|Y=+1)+P(Xi=3|Y=+1)+P(Xi=4|Y=+1)+P(Xi=5|Y=+1)=1
同理令
P(Y=+1)=#(Y=+1)+λ#(训练集总个数N)+2λ在这里只会出现+1和−1这两种情况
同样可以做到类似上面两点的保证。
P(Y=+1)>0
P(Y=+1)+P(Y=−1)=1
注:如果某天你遇到了一个新的问题,你想加入拉普拉斯平滑,但是你又不确定K是多少?你可以去算一下当上面所说的概率和为1的时候,K是多少,这个K的值就是拉普拉斯平滑里的K的值。
关于朴素贝叶斯算法的总结就结束了。如果你有时间的话,建议把《机器学习实战》里面的关于朴素贝叶斯的程序敲一遍!!!如果不熟悉python的话,建议百度搜索《机器学习实战笔记》,已经有人在博客中写了代码的注释。
一个具体的题目帮助你更好的理解:
不考虑拉普拉斯平滑:
考虑拉普拉斯平滑:
有空补上~~