栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

统计学习方法(三) 朴素贝叶斯(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(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​)​=∑K​P(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) ∏j​P(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=1N​I(yi​=ck​)​(说白了就是数据集里有多少个给定类别的样本,比如100个数字里有13个1,那么类别1的概率就是13%)

I I I是指示函数

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

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

朴素贝叶斯算法

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


贝叶斯估计

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

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


未完待续……

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号