当前位置:   article > 正文

机器学习入门之《统计学习方法》笔记——朴素贝叶斯法_请用表的训练数据学习一个朴素贝叶斯分类器

请用表的训练数据学习一个朴素贝叶斯分类器

原文链接
  朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。


目录

##朴素贝叶斯法

  设输入空间 X ⊆ R n X\subseteq \mathbb{R}^n XRn n n n 维向量的集合,输出空间为类标记集合 Y = { c 1 , c 2 , . . . , c K } Y=\left \{ c_1,c_2,...,c_K \right \} Y={c1,c2,...,cK} ,输入特征向量 x ∈ X x \in X xX ,输出类标记为 y ∈ Y y\in Y yY 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 = \left \{ (x_1,y_1),(x_2,y_2),...,(x_n,y_n) \right \} T={(x1,y1),(x2,y2),...,(xn,yn)}

P ( X , Y ) P(X,Y) P(X,Y) 独立同分布产生。

  朴素贝叶斯法就是通过训练集来学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y) .具体就是从先验概率分布和条件概率分布入手,俩概率相乘即可得联合概率。

  称之为朴素是因为将条件概率的估计简化了,对条件概率分布作了条件独立性假设,这也是朴素贝叶斯法的基石,假设如下

P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k) P(X=xY=ck)=P(X(1)=x(1),...,X(n)=x(n)Y=ck)
k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K

  这个公式在之前的假设条件下等价于

∏ j = i n P ( X ( j ) = x ( j ) ∣ Y = c k ) \prod \limits_{j=i}^n P(X^{(j)}=x^{(j)}|Y=c_k) j=inP(X(j)=x(j)Y=ck)

  对于给定的输入向量 x x x ,通过学习到的模型计算后验概率分布 P ( Y = C k ∣ X = x ) P(Y=C_k|X=x) P(Y=CkX=x) ,后验分布中最大的类作为 x x x 的输出结果,根据贝叶斯定理可知后验概率为

P ( Y = c k ∣ 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)}{\sum_kP(X=x|Y=c_k)P(Y=c_k)} P(Y=ckX=x)=kP(X=xY=ck)P(Y=ck)P(X=xY=ck)P(Y=ck)

  其中 ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) ⇔ P ( X = x ) \sum_kP(X=x|Y=c_k)P(Y=c_k)\Leftrightarrow P(X=x) kP(X=xY=ck)P(Y=ck)P(X=x)

  所有 c k c_k ck P ( X = x ) P(X=x) P(X=x) 都是相同的,这样我们可以把输出结果化简成

y = a r g max ⁡ c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y = arg \max \limits_{c_k} P(Y=c_k) \prod_jP(X^{(j)}=x^{(j)}|Y=c_k) y=argckmaxP(Y=ck)jP(X(j)=x(j)Y=ck)

  这样,就了解了朴素贝叶斯法的基本原理了,下面要介绍的是参数估计。

##参数估计

###极大似然估计

  我们已经知道对于给定的输入向量 x x x ,其输出结果可以表示为

y = a r g max ⁡ c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y = arg \max \limits_{c_k} P(Y=c_k) \prod_jP(X^{(j)}=x^{(j)}|Y=c_k) y=argckmaxP(Y=ck)jP(X(j)=x(j)Y=ck)

  可以使用极大似然估计法来估计相应的概率。先验概率 P ( Y = c k ) P(Y=c_k) P(Y=ck) 的极大似然估计是

P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K P(Y=c_k)=\frac{\sum \limits_{i=1}^NI(y_i=c_k)} {N}, k=1,2,...,K P(Y=ck)=Ni=1NI(yi=ck),k=1,2,...,K

   设第 j j j 个特征 x ( j ) x^{(j)} x(j) 可能的取值的集合为 { a j 1 , a j 2 , . . . , a j s j } \left \{ a_{j1} ,a_{j2} ,...,a_{js_j} \right \} {aj1,aj2,...,ajsj} ,条件概率 P ( X ( j ) = a j l ∣ Y = c k ) P(X^{(j)}=a_{jl}|Y=c_k) P(X(j)=ajlY=ck) 的极大似然估计是

P ( X ( j ) = a j l , Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) P(X^{(j)}=a_{jl},Y=c_k)=\frac{\sum \limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)} {\sum \limits_{i=1}^NI(y_i=c_k)} P(X(j)=ajl,Y=ck)=i=1NI(yi=ck)i=1NI(xi(j)=ajl,yi=ck)

j = 1 , 2 , . . . , n ; l = 1 , 2 , . . . , S j ; k = 1 , 2 , . . . , K j=1,2,...,n; l=1,2,...,S_j;k=1,2,...,K j=1,2,...,n;l=1,2,...,Sj;k=1,2,...,K

学习与分类算法

  下面给出朴素贝叶斯法的学习与分类算法。

####算法 (朴素贝叶斯算法)

输入: 训练数据 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } T = \left \{ (x_1,y_1),(x_2,y_2),...,(x_n,y_n) \right \} T={(x1,y1),(x2,y2),...,(xn,yn)} , 其中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) T x_i = (x_i^{(1)},x_i^{(2)},...,x_i^{(n)} )^T xi=(xi(1),xi(2),...,xi(n))T ,$ x_i^{(j)}\in \left { a_{j1} ,a_{j2} ,…,a_{js_j} \right }$ , j = 1 , 2 , . . . , n j=1,2,...,n j=1,2,...,n l = 1 , 2 , . . . , S j l=1,2,...,S_j l=1,2,...,Sj y i ∈ { c 1 , c 2 , . . . , c K } y_i \in \left \{ c_1,c_2,...,c_K \right \} yi{c1,c2,...,cK} ;实例 x x x

输出: 实例 x x x 的分类.

(1) 计算先验概率及条件概率

P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K P(Y=c_k)=\frac{\sum \limits_{i=1}^NI(y_i=c_k)} {N}, k=1,2,...,K P(Y=ck)=Ni=1NI(yi=ck),k=1,2,...,K

P ( X ( j ) = a j l , Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) P(X^{(j)}=a_{jl},Y=c_k)=\frac{\sum \limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)} {\sum \limits_{i=1}^NI(y_i=c_k)} P(X(j)=ajl,Y=ck)=i=1NI(yi=ck)i=1NI(xi(j)=ajl,yi=ck)

j = 1 , 2 , . . . , n ; l = 1 , 2 , . . . , S j ; k = 1 , 2 , . . . , K j=1,2,...,n; l=1,2,...,S_j;k=1,2,...,K j=1,2,...,n;l=1,2,...,Sj;k=1,2,...,K

(2) 对于给定的实例 x = ( x ( 1 ) , x ( 2 ) , . . . , x ( n ) ) T x = (x^{(1)},x^{(2)},...,x^{(n)} )^T x=(x(1),x(2),...,x(n))T ,计算

P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , . . . , K P(Y=c_k) \prod_jP(X^{(j)}=x^{(j)}|Y=c_k),k=1,2,...,K P(Y=ck)jP(X(j)=x(j)Y=ck),k=1,2,...,K

(3) 确定实例 x x x 的类

y = a r g max ⁡ c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y = arg \max \limits_{c_k} P(Y=c_k) \prod_jP(X^{(j)}=x^{(j)}|Y=c_k) y=argckmaxP(Y=ck)jP(X(j)=x(j)Y=ck)

例子:试由下表的训练数据学习一个朴素贝叶斯分类器并确定 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T 的类标记,表中 X ( 1 ) , X ( 2 ) X^{(1)},X^{(2)} X(1),X(2) 为特征, Y Y Y 为类标记。

这里写图片描述

python代码如下:

import numpy as np

#构造NB分类器
def Train(X_train, Y_train, feature):
    global class_num,label
    class_num = 2           #分类数目
    label = [1, -1]         #分类标签
    feature_len = 3         #特征长度
    #构造3×2的列表
    feature = [[1, 'S'],    
               [2, 'M'],
               [3, 'L']]

    prior_prob = np.zeros(class_num)                         # 初始化先验概率
    con_prob = np.zeros((class_num,feature_len,2))   # 初始化条件概率
    
    positive_count = 0     #统计正类
    negative_count = 0     #统计负类
    for i in range(len(Y_train)):
        if Y_train[i] == 1:
            positive_count += 1
        else:
            negative_count += 1
    prior_prob[0] = positive_count / len(Y_train)    #求得正类的先验概率
    prior_prob[1] = negative_count / len(Y_train)    #求得负类的先验概率
    
    '''
    con_prob是一个2*3*2的三维列表,第一维是类别分类,第二维和第三维是一个3*2的特征分类
    '''
    #分为两个类别
    for i in range(class_num):
        #对特征按行遍历
        for j in range(feature_len):
            #遍历数据集,并依次做判断
            for k in range(len(Y_train)): 
                if Y_train[k] == label[i]: #相同类别
                    if X_train[k][0] == feature[j][0]:
                        con_prob[i][j][0] += 1
                    if X_train[k][1] == feature[j][1]:
                        con_prob[i][j][1] += 1

    class_label_num = [positive_count, negative_count]  #存放各类型的数目
    for i in range(class_num):
        for j in range(feature_len):
            con_prob[i][j][0] = con_prob[i][j][0] / class_label_num[i]  #求得i类j行第一个特征的条件概率 
            con_prob[i][j][1] = con_prob[i][j][1] / class_label_num[i]  #求得i类j行第二个特征的条件概率

    return prior_prob,con_prob

#给定数据进行分类
def Predict(testset, prior_prob, con_prob, feature):
    result = np.zeros(len(label))
    for i in range(class_num):
        for j in range(len(feature)):
            if feature[j][0] == testset[0]:
                conA = con_prob[i][j][0]
            if feature[j][1] == testset[1]:
                conB = con_prob[i][j][1]
        result[i] = conA * conB * prior_prob[i]

    result = np.vstack([result,label])

    return result


def main():
    X_train = [[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],  [1, 'S'],
               [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'],  [2, 'L'],
               [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'],  [3, 'L']]
    Y_train = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]   

    #构造3×2的列表
    feature = [[1, 'S'],    
               [2, 'M'],
               [3, 'L']]

    testset = [2, 'S']
    
    prior_prob, con_prob= Train(X_train, Y_train, feature)
    
    result = Predict(testset, prior_prob, con_prob, feature)
    print('The result:',result)

main()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

  得到结果:

The result: [[ 0.02222222  0.06666667]
 [ 1.         -1.        ]]
  • 1
  • 2

###贝叶斯估计

  极大似然估计的一个可能是会出现所要估计的概率值为0的情况,这时会影响到后验概率的计算结果,解决这一问题的方法是采用贝叶斯估计,具体的只需要在极大似然估计的基础上加多一个参数即可。

P λ ( X ( j ) = a j l , Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ , λ ≥ 0 P_{\lambda}(X^{(j)}=a_{jl},Y=c_k)=\frac{\sum \limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)+\lambda} {\sum \limits_{i=1}^NI(y_i=c_k)+S_j\lambda},\lambda \geq 0 Pλ(X(j)=ajl,Y=ck)=i=1NI(yi=ck)+Sjλi=1NI(xi(j)=ajl,yi=ck)+λ,λ0

  当 λ = 0 \lambda=0 λ=0 时就是最大似然估计。常取 λ = 1 \lambda=1 λ=1 ,这时称为拉普拉斯平滑(Laplace smoothing)。

小结

  朴素贝叶斯法高效,且易于实现,但是其缺点就是分类的性能不一定很高。

原文链接:https://quanfita.cn/article/naive_bayes/
个人博客:https://quanfita.cn

##参考文章

  1. 统计学习方法(四)——朴素贝叶斯法
  2. 朴素贝叶斯分类器的应用
  3. 李航统计学习方法——算法3朴素贝叶斯法
  4. 李航《统计学习方法》朴素贝叶斯分类器实现
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/869201
推荐阅读
相关标签
  

闽ICP备14008679号