• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 統計學習方法第四章(樸素貝葉斯)及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次方)次。過于復雜。因此假設樣本的特征之間相互獨立,所以叫樸素。則p(x|y) = p(xi|y)的乘積,i=1,2,n.
    為了防止p(xi|y)連乘時初戀某個數為0,通常選擇一個拉普拉斯平滑。

    2 三要素

    模型:p(y|x) = p(y)p(x|y)/p(x),近似=p(y)p(x|y), =p(y)p(xi|y),i=1,2,n
    策略:01損失函數
    算法:極大似然估計,貝葉斯估計(加拉普拉斯平滑)

    應用

    假設特征相互獨立,常用于垃圾郵件過濾,文本分類等詞袋模型。

    python實現

    class NB(object):
        def __init__(self):
            #每個特征屬性的取值列表
            self.x = []
            #標簽列表
            self.y = []
            #標簽概率列表
            self.py = defaultdict(float)
            #標簽概率列表
            self.pxy = defaultdict(lambda:defaultdict(list))
            #分階數
            self.n = 5
        def preProcess(self,X):
            for i in range(X.shape[1]):
                X[:,i] = self.step(X[:,i],self.n)
            return X
        #分階函數,因為不同特征的數值集大小相差巨大,造成部分概率矩陣變得稀疏,例如某個特征取值[0.2,0.4,0.6,1.2,1.4,1.6,2.2,2.4,2.6],如果分三階則0.2,0.4,0.6時,為1,1.2,1.4,1.6為2
        def step(self,x,n):
            ma = np.max(x)
            mi = np.min(x)
            stepN = (ma-mi)/float(n)
            for i in range(len(x)):
                for j in range(n):
                    a = mi + j*stepN
                    b = mi + (j+1)*stepN
                    if x[i]>= a and x[i] <= b:
                        x[i] = j + 1
                        break
            return x
        def prob(self,element,arr):
            return sum(arr==element)/float(len(arr))
        def fit(self,X,y):
            X = self.preProcess(X)
            self.y = list(set(y))
            for i in range(X.shape[1]):
                self.x.append(list(set(X[:,i])))
            for yi in self.y:
    #             print(yi)
                self.py[yi] = self.prob(yi,self.y)
                for i in range(X.shape[1]):
    #                 print(i)
                    samples = X[y==yi,i]
                    self.pxy[yi][i] = [self.prob(xi,samples) for xi in self.x[i]]
        def predict_one(self,test_x):
            print(test_x)
            prob = 0
            label = self.y[0]
            for yi in self.y:
                tempProb = np.log(self.py[yi])
                for i in range(len(test_x)):
                    tempProb += np.log(self.pxy[yi][i][self.x[i].index(test_x[i])])
                    
                if tempProb>prob:
                    prob = tempProb
                    label = yi
            return label
        def predict(self,samples):
            ylabels = []
            samples = self.preProcess(samples)
            for i in range(samples.shape[0]):
                label = self.predict_one(test_x[i,:])
                ylabels.append(label)
            return np.array(ylabels)
        def score(self,test_x,y):
            ylabels = self.predict(test_x)
            num = 0 
            for i in range(len(ylabels)):
                if ylabels[i] == y[i]:
                    num += 1
            return num/float(len(test_x))
    

    測試

    import numpy as np
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from collections import defaultdict
    X,y = load_iris(return_X_y=True)
    train_x,test_x,train_y,test_y = train_test_split(X,y,test_size=0.3)
    nb = NB()
    nb.fit(train_x,train_y)
    nb.score(test_x,test_y)
    

    由于iris更實用與高斯樸素貝葉斯估計,所以精確率不高

    樸素貝葉斯用于垃圾郵件過濾時,使用多項式樸素貝葉斯,相當于只有一個特征,特征可以取值是所有文本組成的詞匯表。
    python實現

    import numpy as np
    from  collections import defaultdict
    class NBClassify(object):
        #構建包含所有詞的詞表
        def createVocab(self,trainData):
            vocabSet = set([])
            for document in trainData:
                vocabSet = vocabSet | set(document)
            return list(vocabSet)
        #將訓練樣本數據轉化為詞表向量
        def bagOfVocab(self,vocabLst,inputData):
            inputVocab = np.zeros(len(vocabLst))
            for one in inputData:
                if one in vocabLst:
                    inputVocab[vocabLst.index(one)] += 1
            return inputVocab
         
        def fit(self,X,y):        
            self.vocabLst = self.createVocab(X)
            #標簽先驗概率
            self.py  = defaultdict(float)
            #標簽,特征,條件概率,初始化特征為1
            self.pxy = defaultdict(lambda :np.ones(len(self.vocabLst)))
            dataVactor = []
            for oneDocument in X:
                documentVactor = self.bagOfVocab(self.vocabLst,oneDocument)
                dataVactor.append(documentVactor)
            dataMatrix = np.array(dataVactor)
            for i in range(len(y)):
                label = y[i]
                self.py[label] += 1
                self.pxy[label] += dataMatrix[i]
            for key in self.py.keys():
                self.py[key] = np.log(self.py[key]/dataMatrix.shape[0])
            for key in self.pxy.keys():
                self.pxy[key] = np.log(self.pxy[key]/np.sum(self.pxy[key]))
        def predictOne(self,testData):
            testDataVector = self.bagOfVocab(self.vocabLst,testData)
            maxProb = -np.inf
            label = 0
            for key,value in self.pxy.items():
                tempProb = self.py[key] + np.sum(value*testDataVector)
                if tempProb>maxProb:
                    maxProb = tempProb
                    label = key
            return label
    
    

    測試

    postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                   ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                   ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                   ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                   ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                   ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0, 1, 0, 1, 0, 1]
    nb = NBClassify()
    nb.fit(postingList,classVec)
    testEntry = ['love', 'my', 'dalmation']
    nb.predictOne(testEntry)
    testEntry1 = ['stupid', 'garbage']
    nb.predictOne(testEntry1)
    

    sklearn實現
    sklearn.naive_bayes包含三種貝葉斯分類器。高斯樸素貝葉斯(GaussianNB),多項式樸素貝葉斯(MultinomialNB),伯努利樸素貝葉斯(BernoulliNB )
    1 GaussianNB:適用于特征是連續變量。條件概率分布p(x|y)符合高斯分布。例如load_iris。
    在這里插入圖片描述
    均值和方差,從y=ck(某一類)且xi=xi的數據中求得。

    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
    X,y = load_iris(return_X_y=True)
    train_x,test_x,train_y,test_y = train_test_split(X,y,test_size=0.3)
    gnb = GaussianNB()
    gnb.fit(train_x,train_y)#訓練
    gnb.predict(test_x)#預測
    gnb.score(test_x,test_y)#準確率
    

    2 MultinomialNB:適用于特征是離散變量,條件概率分布p(x|y)符合多項式分布。例如上例中的垃圾郵件過濾。
    在這里插入圖片描述

    from sklearn.datasets import fetch_20newsgroups
    from sklearn.model_selection import train_test_split
    from sklearn.feature_extraction.text  import CountVectorizer
    from sklearn.naive_bayes import MultinomialNB
    newsdata = fetch_20newsgroups(subset='all')
    cv = CountVectorizer()
    newsdataVector = cv.fit_transform(newsdata.data)
    train_x,test_x,train_y,test_y = train_test_split(newsdataVector,newsdata.target,test_size=0.3)
    mnb = MultinomialNB()
    mnb.fit(train_x,train_y)
    mnb.predict(test_x)
    mnb.score(test_x,test_y)
    

    3 BernoulliNB :適用于特征是離散變量,條件概率分布p(x|y)符合伯努利分布。即特征取值只有0,1.
    垃圾郵件過濾中相當于文檔向量不是詞出現的詞數,而是是否出現0或1.

    參考文獻
    樸素貝葉斯
    貝葉斯垃圾郵件過濾
    sklearn三種貝葉斯
    多項式貝葉斯
    sklearn中文翻譯

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

    智能推薦

    讀書筆記-統計學習方法(小藍)第四章

    第四章 樸素貝葉斯法 4.1 樸素貝葉斯法的學習和分類 4.2 樸素貝葉斯法的參數估計 實踐: 4.1 樸素貝葉斯法的學習和分類 樸素貝葉斯法是基于貝葉斯定理 和條件獨立假設的分類方法。 先驗分布: 條件概率分布: 如果對條件概率分布做條件獨立性假設的話,條件概率分布的式子就會變成: 當x的條件下y是分類k的概率為(結果是通過貝葉斯轉化的結果,其中分母是相當于P(X=x)的邊際概率,與y無關,是個...

    李航(統計學習方法第四章)

    第四章 樸素貝葉斯法 樸素貝葉斯法和貝葉斯估計是不同的概念。 基于特征條件獨立假設學習輸入輸出聯合概率分布 基于此模型給出后驗概率最大的輸出y 本章敘述: 樸素貝葉斯法 學習與分類 參數估計算法 4.1 樸素貝葉斯法的學習與分類 4.1.1 基本方法 關于貝葉斯定理,以下摘一段 wikipedia 上的簡介: 所謂的貝葉斯定理源于他生前為解決一個“逆概”問題寫的一篇文章,而...

    機器學習入門之《統計學習方法》筆記——樸素貝葉斯法

      樸素貝葉斯(naive Bayes)法是基于貝葉斯定理與特征條件獨立假設的分類方法。 目錄 樸素貝葉斯法 參數估計 極大似然估計 學習與分類算法 算法 樸素貝葉斯算法 貝葉斯估計 小結 參考文章 樸素貝葉斯法   設輸入空間X⊆RnX⊆Rn 為nn 維向量的集合,輸出空間為類標記集合Y={c1,c2,...,cK}Y={c1,c2,....

    統計學習方法學習筆記3——樸素貝葉斯模型

    樸素貝葉斯屬于:概率模型、參數化模型、和生成模型 目錄 1.樸素貝葉斯基本方法 2.后驗概率最大化的含義 3.樸素貝葉斯算法: 樸素貝葉斯python實現4.1: 樸素貝葉斯sklearn實現作業4.1 貝葉斯的優缺點: 1.樸素貝葉斯基本方法 2.后驗概率最大化的含義 3.樸素貝葉斯算法: 樸素貝葉斯python實現4.1: 結果: 樸素貝葉斯sklearn實現作業4.1 貝葉斯的優缺點: 由于...

    統計學習方法之樸素貝葉斯理解和代碼復現

    樸素貝葉斯 聯合概率 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.后驗概率推...

    猜你喜歡

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

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