• <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),貝葉斯估計及python實現

    標簽: 統計學習方法

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

    完整代碼:
    https://github.com/xjwhhh/LearningML/tree/master/StatisticalLearningMethod
    歡迎follow和star

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

    對于給定的訓練數據集,首先基于特征條件獨立假設學習輸入/輸出的聯合概率分布;然后基于此模型,對給定的輸入x,利用貝葉斯定理求出后驗概率最大的輸出y。

    樸素貝葉斯法實現簡單,學習與預測的效率都很高,是一種常用的方法

    下圖是樸素貝葉斯算法:

    樸素貝葉斯算法

    具體的解釋和證明可以看《統計學習方法》或其他博文,這里不再贅述

    python代碼實現,使用MINST數據集,為了避免概率值為0的情況,使用貝葉斯估計:

    import cv2
    import time
    import logging
    import numpy as np
    import pandas as pd
    
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    
    def log(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            logging.debug('start %s()' % func.__name__)
            ret = func(*args, **kwargs)
    
            end_time = time.time()
            logging.debug('end %s(), cost %s seconds' % (func.__name__, end_time - start_time))
    
            return ret
    
        return wrapper
    
    
    # 二值化,將圖片進行二值化的目的是確定每個特征可選的值只有兩種,對應于train方法里conditional_probability最后一個維度的長度2
    def binaryzation(img):
        cv_img = img.astype(np.uint8)
        cv2.threshold(cv_img, 50, 1, cv2.THRESH_BINARY_INV, cv_img)
        return cv_img
    
    
    @log
    def train(train_set, train_labels):
        class_num = len(set(train_labels))
        feature_num = len(train_set[0])
        prior_probability = np.zeros(class_num)  # 先驗概率
        conditional_probability = np.zeros((class_num, feature_num, 2))  # 條件概率
        print(conditional_probability.shape)
    
        for i in range(len(train_labels)):
            img = binaryzation(train_set[i])  # 圖片二值化
            label = train_labels[i]
    
            prior_probability[label] += 1
    
            for j in range(feature_num):
                conditional_probability[label][j][img[j]] += 1
    
        # 貝葉斯估計,因為分母都相同,所以先驗概率和條件概率都不用除以分母
        prior_probability += 1
        for label in set(train_labels):
            for j in range(feature_num):
                conditional_probability[label][j][0] += 1
                conditional_probability[label][j][0] /= (len(train_labels[train_labels == label]) + 2 * 1)
                conditional_probability[label][j][1] += 1
                conditional_probability[label][j][1] /= (len(train_labels[train_labels == label]) + 2 * 1)
    
        # print(prior_probability)
        # print(conditional_probability)
        return prior_probability, conditional_probability
    
    
    @log
    def predict(test_features, prior_probability, conditional_probability):
        result = []
        for test in test_features:
            img = binaryzation(test)
    
            max_label = 0
            max_probability = 0
    
            for i in range(len(prior_probability)):
    
                # print("label",i)
                probability = prior_probability[i]
                for j in range(len(img)):  # 特征長度
                    # print("j",j)
                    probability *= int(conditional_probability[i][j][img[j]])
                if max_probability < probability:
                    max_probability = probability
                    max_label = i
            result.append(max_label)
        return np.array(result)
    
    
    if __name__ == '__main__':
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)
    
        raw_data = pd.read_csv('../data/train.csv', header=0)
        data = raw_data.values
    
        imgs = data[0:2000, 1:]
        labels = data[0:2000, 0]
    
        # print(imgs.shape)
    
        # 選取 2/3 數據作為訓練集, 1/3 數據作為測試集
        train_features, test_features, train_labels, test_labels = train_test_split(imgs, labels, test_size=0.33,random_state=1)
    
        prior_probability, conditional_probability = train(train_features, train_labels)
        test_predict = predict(test_features, prior_probability, conditional_probability)
        score = accuracy_score(test_labels, test_predict)
        print("The accuracy score is ", score)
    
    版權聲明:本文為devil_bye原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/devil_bye/article/details/80723510

    智能推薦

    樸素貝葉斯 (Naive Bayes)

    樸素貝葉斯 (Naive Bayes) 前言 貝葉斯定理概率論中必學的一個定理,而樸素貝葉斯就是基于此的一種簡單分類方法。 樸素貝葉斯(naive Bayes)法是是基于 貝葉斯定理 和 特征條件獨立假設 的分類方法 數學解釋 條件獨立公式,如果X和Y相互獨立,則有: P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y) 條件概率公式: P(Y∣X)=P(X,...

    樸素貝葉斯(Naive Bayes)

    學習目標: 掌握貝葉斯公式 結合兩個實例了解貝樸素葉斯的參數估計 掌握貝葉斯估計 學習內容: 1.2 樸素貝葉斯的介紹 樸素貝葉斯算法(Naive Bayes, NB) 是應用最為廣泛的分類算法之一。它是基于貝葉斯定義和特征條件獨立假設的分類器方法。由于樸素貝葉斯法基于貝葉斯公式計算得到,有著堅實的數學基礎,以及穩定的分類效率。NB模型所需估計的參數很少,對缺失數據不太敏感,算法也比較簡單。當年的...

    《機器學習實戰》第四章學習筆記(樸素貝葉斯)

    樸素貝葉斯法是基于貝葉斯定理與特征條件獨立假設的分類方法。對于給定的訓練數據集,首先基于特征條件獨立假設學習輸入/輸出的聯合概率密度分布;然后基于此模型,對于給定的輸入x,利用貝葉斯定理求出后驗概率最大的輸出y。樸素貝葉斯法實現簡單,學習與預測的效率都很高,是一種常用的方法。 一、樸素貝葉斯 1.1 基本方法 樸素貝葉斯法對條件概率分布作了條件獨立性的假設。由于這是一個較強的假設,樸素貝葉斯由此得...

    高斯樸素貝葉斯(Gaission Naive Bayes) 之 Python

    這里寫自定義目錄標題 前言 樸素貝葉斯(naive bayes ) 貝葉斯公式及原理 條件獨立假設 高斯樸素貝葉斯分類器 知識補充 全概率公式以及貝葉斯公式 總體方差和樣本方差 自己的見解 合理的創建標題,有助于目錄的生成 如何改變文本的樣式 插入鏈接與圖片 如何插入一段漂亮的代碼片 生成一個適合你的列表 創建一個表格 設定內容居中、居左、居右 SmartyPants 創建一個自定義列表 如何創建...

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

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

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