• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 機器學習入門之《統計學習方法》筆記——樸素貝葉斯法

    標簽: 機器學習  樸素貝葉斯

    ??樸素貝葉斯(naive Bayes)法是基于貝葉斯定理與特征條件獨立假設的分類方法。


    目錄


    樸素貝葉斯法

    ??設輸入空間X?Rnn 維向量的集合,輸出空間為類標記集合Y={c1,c2,...,cK} ,輸入特征向量xX ,輸出類標記為yYP(X,Y)XY 的聯合概率分布,數據集

    T={(x1,y1),(x2,y2),...,(xn,yn)}

    P(X,Y) 獨立同分布產生。

    ??樸素貝葉斯法就是通過訓練集來學習聯合概率分布P(X,Y) .具體就是從先驗概率分布和條件概率分布入手,倆概率相乘即可得聯合概率。

    ??稱之為樸素是因為將條件概率的估計簡化了,對條件概率分布作了條件獨立性假設,這也是樸素貝葉斯法的基石,假設如下

    P(X=x|Y=ck)=P(X(1)=x(1),...,X(n)=x(n)|Y=ck)

    k=1,2,...,K

    ??這個公式在之前的假設條件下等價于

    j=inP(X(j)=x(j)|Y=ck)

    ??對于給定的輸入向量x ,通過學習到的模型計算后驗概率分布P(Y=Ck|X=x) ,后驗分布中最大的類作為x 的輸出結果,根據貝葉斯定理可知后驗概率為

    P(Y=ck|X=x)=P(X=x|Y=ck)P(Y=ck)kP(X=x|Y=ck)P(Y=ck)

    ??其中kP(X=x|Y=ck)P(Y=ck)?P(X=x)

    ??所有ckP(X=x) 都是相同的,這樣我們可以把輸出結果化簡成

    y=argmaxckP(Y=ck)jP(X(j)=x(j)|Y=ck)

    ??這樣,就了解了樸素貝葉斯法的基本原理了,下面要介紹的是參數估計。

    參數估計

    極大似然估計

    ??我們已經知道對于給定的輸入向量x ,其輸出結果可以表示為

    y=argmaxckP(Y=ck)jP(X(j)=x(j)|Y=ck)

    ??可以使用極大似然估計法來估計相應的概率。先驗概率P(Y=ck) 的極大似然估計是

    P(Y=ck)=i=1NI(yi=ck)N,k=1,2,...,K

    ?? 設第j 個特征x(j) 可能的取值的集合為{aj1,aj2,...,ajsj} ,條件概率P(X(j)=ajl|Y=ck) 的極大似然估計是

    P(X(j)=ajl,Y=ck)=i=1NI(xi(j)=ajl,yi=ck)i=1NI(yi=ck)

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

    學習與分類算法

    ??下面給出樸素貝葉斯法的學習與分類算法。

    算法 (樸素貝葉斯算法)

    輸入: 訓練數據 T={(x1,y1),(x2,y2),...,(xn,yn)} , 其中xi=(xi(1),xi(2),...,xi(n))Txi(j){aj1,aj2,...,ajsj}j=1,2,...,nl=1,2,...,Sjyi{c1,c2,...,cK} ;實例x

    輸出: 實例x 的分類.

    (1) 計算先驗概率及條件概率

    P(Y=ck)=i=1NI(yi=ck)N,k=1,2,...,K

    P(X(j)=ajl,Y=ck)=i=1NI(xi(j)=ajl,yi=ck)i=1NI(yi=ck)

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

    (2) 對于給定的實例x=(x(1),x(2),...,x(n))T ,計算

    P(Y=ck)jP(X(j)=x(j)|Y=ck),k=1,2,...,K

    (3) 確定實例x 的類

    y=argmaxckP(Y=ck)jP(X(j)=x(j)|Y=ck)

    例子:試由下表的訓練數據學習一個樸素貝葉斯分類器并確定

    x=(2,S)T
    的類標記,表中X(1),X(2) 為特征,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()
    

    ??得到結果:

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

    貝葉斯估計

    ??極大似然估計的一個可能是會出現所要估計的概率值為0的情況,這時會影響到后驗概率的計算結果,解決這一問題的方法是采用貝葉斯估計,具體的只需要在極大似然估計的基礎上加多一個參數即可。

    Pλ(X(j)=ajl,Y=ck)=i=1NI(xi(j)=ajl,yi=ck)+λi=1NI(yi=ck)+Sjλ,λ0

    ??當λ=0 時就是最大似然估計。常取λ=1 ,這時稱為拉普拉斯平滑(Laplace smoothing)。

    小結

    ??樸素貝葉斯法高效,且易于實現,但是其缺點就是分類的性能不一定很高。

    參考文章

    1. 統計學習方法(四)——樸素貝葉斯法
    2. 樸素貝葉斯分類器的應用
    3. 李航統計學習方法——算法3樸素貝葉斯法
    4. 李航《統計學習方法》樸素貝葉斯分類器實現
    版權聲明:本文為qq_30611601原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_30611601/article/details/79343928

    智能推薦

    統計學習筆記六----樸素貝葉斯

    前言   樸素貝葉斯(naive Bayes)算法是基于貝葉斯定理和特征條件獨立假設的分類方法,它是一種生成模型!   對于給定的訓練數據集,首先基于特征條件獨立假設學習輸入/輸出的聯合概率分布;然后基于此模型,對給定的輸入x,利用貝葉斯定理求出后驗概率最大的輸出y。   樸素貝葉斯算法實現簡單,學習與預測的效率都很高,是一種常用的方法。 條件獨立性的假設 樸素貝葉斯法對條件概率分布作了條件獨立性...

    樸素貝葉斯(naive Bayes)的python實現——基于《統計學習方法》例題的編程求解

    樸素貝葉斯方法是基于貝葉斯定理與特征條件獨立假設的分類方法。認為樣本的特征X與標簽y服從聯合概率分布P(X, y),所有的樣本都是基于這個概率分布產生的。由于條件概率P(X=x|Y=y)的參數具有指數數量級,因此進行估算切實際。貝葉斯法對條件概率分布做了條件獨立性假設,從而減少了模型的復雜性,增加了模型的泛化能力,減少了過擬合的風險。 #后驗概率最大化 可以證明,期望風險最小化準則可以得到后驗概率...

    《統計學習方法》代碼全解析——第四部分樸素貝葉斯

     1.樸素貝葉斯法是典型的生成學習方法。生成方法由訓練數據學習聯合概率分布  (,) P(X,Y) ,然后求得后驗概率分布 (|) P(Y|X) 。具體來說,利用訓練數據學習 (|) P(X|Y) 和 () P(Y) 的估計,得到聯合概率分布: (,)=()(|)  概率估計方法可以是極大似然估計或貝葉斯估計。 2.樸素貝葉斯法的基本假設是條件獨立性 這是一個較強的假...

    統計學習方法第四章(樸素貝葉斯)及Python實現及sklearn實現

    1原理 樸素貝葉斯 貝葉斯:根據貝葉斯定理p(y|x) = p(y)p(x|y)/p(x).選擇p(y|x) 最大的類別作為x的類別。可知樸素貝葉斯是監督學習的生成模型(由聯合概率分布得到概率分布)。選擇p(y|x) 最大的類別時,分母相同,所以簡化為比較 p(y)p(x|y)的大小。 樸素: 計算p(x|y)的概率,假設x是n維向量,每維向量有sn個取值可能,則就要計算類別*(sn的n次方)次。...

    機器學習入門之《統計學習方法》筆記整理——K近鄰法

    目錄 k近鄰算法 算法 k近鄰法 k近鄰模型 距離度量 k值選擇 分類決策規則 k近鄰法的實現kd樹 構造kd樹 算法 構造平衡kd樹 搜索kd樹 算法 用kd樹的最近鄰搜索 小結 參考文章 k近鄰算法   k近鄰算法,即是給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例,這K個實例的多數屬于某個類,就把該輸入實例分類到這個類中。  &e...

    猜你喜歡

    機器學習入門?樸素貝葉斯

    本文適用讀者: 了解樸素貝葉斯,并且python version 為 3.x 樸素貝葉斯的優缺點及其適用性: 優點:在數據較少的情況下仍然有效,可以處理多類別問題 缺點:對于輸入數據的準備方式較為敏感 使用數據類型:標稱型數據 樸素貝葉斯的一般過程: 1.收集數據:可以使用任何方法.本章使用RSS源 2.準備數據:需要數值型或者布爾型數據 3.分析數據:有大量特征時,繪制特征作用不大,此時使用直方...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡