• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 統計學習方法之樸素貝葉斯理解和代碼復現

    標簽: 機器學習

    樸素貝葉斯

    聯合概率 P(A,B) = P(B|A)*P(A) = P(A|B)*P(B)將右邊兩個式子聯合得到下面的式子:

    P(A|B)表示在B發生的情況下A發生的概率。P(A|B) = [P(B|A)*P(A)] / P(B)

    直觀理解一下這個式子,如下圖,問題A在我們知道B信息之后概率發生了變化(圖片來自于小白之通俗易懂的貝葉斯定理(Bayes’ Theorem
    在這里插入圖片描述

    1.后驗概率推導

    在這里插入圖片描述

    ? 樸素貝葉斯條件:向量X的每一個特征項是獨立同分布,這個條件過于寬泛,但是為了計算簡便,我們嘗試使用一下,用了之后發現效果還不錯,那就用著吧

    2.極大似然估計求取分類器y值

    在這里插入圖片描述

    ? 還記得原先求不同類別下的最大概率這一式子嗎(分類器y)?里面有很多的連乘記得嗎?

    ? 這里提出了一個問題,那么多概率連乘,如果其中有一個概率為0怎么辦?那整個式子直接就是0了,這樣不對。所以我們連乘中的每一項都得想辦法讓它保證不是0,哪怕它原先是0,(如果原先是0,表示在所有連乘項中它概率最小,那么轉換完以后只要仍然保證它的值最小,對于結果的大小來說沒有影響)這里就使用到了貝葉斯估計。
    在這里插入圖片描述
    ? 做這種變換是為了每一個概率不為0,從而對于y這個連乘的式子沒有影響,但是為了保持概率值之和依舊為1,才演變成上面的式子

    3.例題理解

    3.1樸素貝葉斯

    在這里插入圖片描述
    在這里插入圖片描述

    3.2貝葉斯估計

    在這里插入圖片描述

    4.補充

    ? 在實際運用中,不光需要使用貝葉斯估計(保證概率不為0),同時也要取對數(保證連乘結果不下溢出)。

    為什么?

    ? 由于連乘項都是0-1之間的,那很多個(特征個數)0-1之間的數相乘,最后的數一定是非常非常小了,可能無限接近于0。對于程序而言過于接近0的數可能會造成下溢出,也就是精度不夠表達了。所以我們會給整個連乘項取對數,這樣哪怕所有連乘最后結果無限接近0,那取完log以后數也會變得很大(雖然是負的很大),計算機就可以表示了。

    取完log以后結果會不會發生變化?

    ? 答案是不會的。log在定義域內是遞增函數,log(x)中的x也是遞增函數。在單調性相同的情況下,連乘得到的結果大,log取完也同樣大,并不影響不同的連乘結果的大小的比較

    5.代碼復現(jupyter)

    #下載minist手寫數據集,并加載
    import tensorflow as tf
    mnist = tf.keras.datasets.mnist
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    
    #X_train.shape is (60000, 28, 28)
    #y_train.shape is (60000,)
    #我們將數據展開一下
    X_train = X_train.reshape(-1 , 28*28)
    y_train = y_train.reshape(-1 , 1)
    X_test = X_test.reshape(-1 , 28*28)
    y_test = y_test.reshape(-1 , 1)
    
    #為了簡便,我們將手寫數據圖片二值化一下
    X_train[X_train <  128] = 0
    X_train[X_train >= 128] = 1
    X_test[X_test <  128] = 0
    X_test[X_test >= 128] = 1
    
    import numpy as np
    #根據公式計算先驗概率P_y,利用拉普拉斯平滑λ=1,并對連乘公式取log
    P_y = np.zeros((10 , 1))
    classes = 10
    for i in range(classes):
        P_y[i] = ((np.sum(y_train == i))+1)/(len(y_train)+classes)
    P_y = np.log(P_y)
    print(P_y)
    
    #計算條件概率Px_y
    #這個模塊實現求取各個特征值的個數
    Px_y = np.zeros((classes , X_train.shape[1] , 2))
    for i in range(X_train.shape[0]):
        k = y_train[i]
        x = X_train[i]
        for feature in range(X_train.shape[1]):
            Px_y[k,feature,x[f]] += 1       
    
    #開始計算條件概率Px_y
    #
    for index in range(classes):
        for f in range(X_train.shape[1]):
            Px_y[index , f , 0] = (Px_y[index , f , 0] + 1) / (np.sum(y_train == index) + 2)
            Px_y[index , f , 1] = (Px_y[index , f , 1] + 1) / (np.sum(y_train == index) + 2)
    #為了把連乘變成連加,我們對Px_y取一個log對數
    Px_y = np.log(Px_y)
    #拿一個出來看看
    print(Px_y[0])
    
    #我們預測的最終結果放在predict中
    #每一個數據在10個分類器的結果放在res中,取一個argmax就得到一個預測值
    predict = np.zeros((y_test.shape[0],1))
    for data in range(y_test.shape[0]):
        res = np.zeros((classes , 1))
        for i in range(classes):
            res[i] = P_y[i]
            for f in range(X_train.shape[1]):
                res[i] += Px_y[i,f,X_test[data,f]]
        predict[data] = np.argmax(res)
    predict = predict.astype(int)
    #取兩個拿出來對比一下
    print(predict[:5])
    print(y_test[:5])
    
    #預測一下準確率
    precision = np.sum(predict == y_test) / y_test.shape[0]
    print(precision)
    

    覺得有用就請點個贊吧

    參考文章:
    李航統計學習方法第二版
    統計學習方法|樸素貝葉斯原理剖析及實現

    版權聲明:本文為a2352159950原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/a2352159950/article/details/104896331

    智能推薦

    (每天一點點)統計學習方法——樸素貝葉斯法

    1、概率論基礎 貝葉斯原理就是求解后驗概率。如果已知p(x|c)要求p(c|x),我們可以使用貝葉斯公式進行求解。 貝葉斯公式: ps:圖片出處 樸素貝葉斯分類器中的樸素指的是特征樣本之間相互獨立。 2、舉個栗子 已在線社區留言板為例子,我們要屏蔽侮辱性言論。對此問題我們建立兩個類別:侮辱性和非侮辱性。我們先定一個詞典,比如[dog,love,cute…],然后把一條留言分成詞向量[...

    統計學習方法第四章(樸素貝葉斯)及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次方)次。...

    統計學習方法第四章:樸素貝葉斯法(naive Bayes),貝葉斯估計及python實現

    統計學習方法第二章:感知機(perceptron)算法及python實現 統計學習方法第三章:k近鄰法(k-NN),kd樹及python實現 統計學習方法第四章:樸素貝葉斯法(naive Bayes),貝葉斯估計及python實現 統計學習方法第五章:決策樹(decision tree),CART算法,剪枝及python實現 統計學習方法第五章:決策樹(decision tree),ID3算法,C...

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

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

    李航統計學樸素貝葉斯例4.1python代碼

    關于樸素貝葉斯算法的原理可以參考李航統計學習方法,博客的話,這篇就不錯:https://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html 下面是關于李航一書例題的代碼實現部分: 首先是例4.1不加分類的部分: 先貼結果: 感覺比kd樹好寫很多,上代碼:(新手上路,大神們多指點)  ...

    猜你喜歡

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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