朴素贝叶斯是一个基于贝叶斯定理与特征条件独立假设的分类方法。
不想搞的太枯燥,所以用大名鼎鼎的“三门问题”引入贝叶斯定理(这个问题真是太有意思了):
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
是不是非常反直觉?是不是不信?我们写个代码验证一下:
import random
def td(exchange):
a = random.sample(range(0,100),3) # 三个数里最大的那个是中奖彩票
b = random.randint(0,2) # 随机抽取一张彩票
chooce = a[b]
max_index = a.index(max(a)) # 有奖的彩票
max_val = max(a)
a.pop(b)
a.remove(min(a))
if chooce == max_val:
if exchange:
return 1
else:
return 0
else:
if exchange:
return 0
else:
return 1
def exchange(j):
print('抽奖开始')
print('老子铁头娃,打死也不换')
z = 0
for i in range(j):
z += td(True)
print(f'抽了{
j}次,中奖{
z}次,中奖率{
z/j*100}%')
def noexchange(j):
print('抽奖开始')
print('老子说啥都要换,谁也拦不住')
z = 0
for i in range(j):
z += td(False)
print(f'抽了{
j}次,中奖{
z}次,中奖率{
z/j*100}%')
print('#############################')
exchange(10000)
print('#############################')
noexchange(10000)
print('#############################')
最后结果:
#############################
抽奖开始
老子铁头娃,打死也不换
抽了10000次,中奖3378次,中奖率33.78%
#############################
抽奖开始
老子说啥都要换,谁也拦不住
抽了10000次,中奖6690次,中奖率66.9%
#############################
这里终于引出了贝叶斯定理: P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac{P(B|A)P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)(用这个公式套用一下你会发现交换后中奖概率为66.7%。)
设输出空间为类标记集合 y = { c 1 , c 2 , . . . c K } y=\{c_1,c_2,...c_K\} y={ c1,c2,...cK},输入为特征向量 x x x。 X X X是输入空间上的随机向量, Y Y Y是定义在输出空间上的随机变量。 P ( X , Y ) P(X,Y) P(X,Y)是 X X X和 Y Y Y的联合概率分布。训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={ (x1,y1),(x2,y2),...,(xN,yN)}由 P ( X , Y ) P(X,Y) P(X,Y)独立同分布产生。
朴素贝叶斯要完成分类任务,那么式中的先验情况就是给定样本 X X X是 x x x,求得 Y Y Y为 c K c_K cK的概率。即 P ( Y = c K ∣ X = x ) P(Y=c_K|X=x) P(Y=cK∣X=x).根据贝叶斯定理可推导:
P ( Y = c K ∣ X = x ) = P ( X = x ∣ Y = c K ) P ( Y = c K ) P ( X = x ) = P ( X = x ∣ Y = c K ) P ( Y = c K ) ∑ K P ( X = x ∣ Y = c K ) P ( Y = c K ) P(Y=c_K|X=x)=\frac{P(X=x|Y=c_K)P(Y=c_K)}{P(X=x)}=\frac{P(X=x|Y=c_K)P(Y=c_K)}{\sum_KP(X=x|Y=c_K)P(Y=c_K)} P(Y=cK∣X=x)=P(X=x)P(X=x∣Y=cK)P(Y=cK)=∑KP(X=x∣Y=cK)P(Y=cK)P(X=x∣Y=cK)P(Y=cK)
到了这一步,要引入一个假设:输入空间的每个维度是相互独立的。这个假设其实是不严谨的,但如果要考虑维度之间的相关性会使模型过于复杂,而且大家发现即使用了这个不严谨的假设也能得到不错的效果。通过这个假设容易证明上式的 P ( X = x ∣ Y = c K ) P(X=x|Y=c_K) P(X=x∣Y=cK)实际上可以写成 ∏ j P ( X ( j ) = x ( j ) ∣ Y = c K ) \prod_{j}P(X^{(j)}=x^{(j)}|Y=c_K) ∏jP(X(j)=x(j)∣Y=cK), j j j代表不同的维度。因此最终公式转换为如下的样子:
这就是朴素贝叶斯分类的基本公式。于是朴素贝叶斯分类器可表示为:
可以发现对于所有的类别,分母不变,所以把这个式子直接乘一个分母结果不变。最终得到:
这就是最终简化版的朴素贝叶斯分类器。至于式子里面的两项具体怎么求,我们首先看第一项。
P = ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N P=(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N} P=(Y=ck)=N∑i=1NI(yi=ck)(说白了就是数据集里有多少个给定类别的样本,比如100个数字里有13个1,那么类别1的概率就是13%)
I I I是指示函数
再看第二项(其实跟第一项的构造方法类似):
整个过程比较复杂,附一份比较形象的手写版:
看到这里还是懵的小伙伴没有关系,上个简单的例题就全明白了:
还记的贝叶斯分类器的表达式中有一大串连乘吗?那么如果有一个概率为0,那么这样整个式子都是0.为了避免这种情况,需要保证每一项都大于0.
加入的 λ \lambda λ和 S j S_j Sj保证了每个概率都大于零,而所有概率之和正好等于1。
未完待续……