统计学习方法(三) 朴素贝叶斯(naive Bayes)上

统计学习方法(三) 朴素贝叶斯(naive Bayes)

朴素贝叶斯是一个基于贝叶斯定理与特征条件独立假设的分类方法。

三门问题

不想搞的太枯燥,所以用大名鼎鼎的“三门问题”引入贝叶斯定理(这个问题真是太有意思了):

三门问题(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(AB)=P(B)P(BA)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=cKX=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=cKX=x)=P(X=x)P(X=xY=cK)P(Y=cK)=KP(X=xY=cK)P(Y=cK)P(X=xY=cK)P(Y=cK)

到了这一步,要引入一个假设:输入空间的每个维度是相互独立的。这个假设其实是不严谨的,但如果要考虑维度之间的相关性会使模型过于复杂,而且大家发现即使用了这个不严谨的假设也能得到不错的效果。通过这个假设容易证明上式的 P ( X = x ∣ Y = c K ) P(X=x|Y=c_K) P(X=xY=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代表不同的维度。因此最终公式转换为如下的样子:

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第1张图片

这就是朴素贝叶斯分类的基本公式。于是朴素贝叶斯分类器可表示为:

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第2张图片

可以发现对于所有的类别,分母不变,所以把这个式子直接乘一个分母结果不变。最终得到:

请添加图片描述

这就是最终简化版的朴素贝叶斯分类器。至于式子里面的两项具体怎么求,我们首先看第一项。

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)=Ni=1NI(yi=ck)(说白了就是数据集里有多少个给定类别的样本,比如100个数字里有13个1,那么类别1的概率就是13%)

I I I是指示函数

再看第二项(其实跟第一项的构造方法类似):

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第3张图片

整个过程比较复杂,附一份比较形象的手写版:

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第4张图片

朴素贝叶斯算法

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第5张图片

看到这里还是懵的小伙伴没有关系,上个简单的例题就全明白了:

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第6张图片
统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第7张图片

贝叶斯估计

还记的贝叶斯分类器的表达式中有一大串连乘吗?那么如果有一个概率为0,那么这样整个式子都是0.为了避免这种情况,需要保证每一项都大于0.

统计学习方法(三) 朴素贝叶斯(naive Bayes)上_第8张图片

加入的 λ \lambda λ S j S_j Sj保证了每个概率都大于零,而所有概率之和正好等于1。


未完待续……

你可能感兴趣的:(统计学习方法,机器学习,算法)