1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        機器學習基礎:樸素貝葉斯及經(jīng)典實例講解

        共 6338字,需瀏覽 13分鐘

         ·

        2022-05-16 08:12

        點擊上方小白學視覺”,選擇加"星標"或“置頂

        重磅干貨,第一時間送達

        原文連接:?

        https://www.cnblogs.com/lliuye/p/9178090.htmlhttps://www.cnblogs.com/huangyc/p/10327209.html

        樸素貝葉斯法(Naive Bayes)是基于貝葉斯定理特征條件獨立假設分類方法。對于給定的訓練數(shù)據(jù)集,首先基于特征條件獨立假設學習輸入/輸出的聯(lián)合概率分布;然后基于此模型,對給定的輸入 x ,利用貝葉斯定理求出后驗概率最大的輸出 y ,即為對應的類別。

        在夏季,某公園男性穿涼鞋的概率為 1/2 ,女性穿涼鞋的概率為 2/3 ,并且該公園中男女比例通常為 2:1 ,問題:若你在公園中隨機遇到一個穿涼鞋的人,請問他的性別為男性或女性的概率分別為多少?


        先驗概率


        我們使用以上例子來解釋一下什么是先驗概率。根據(jù)以上例子我們設定:假設某公園中一個人是男性為事件 Y=ymen ,是女性則是 Y=ywomen ;一個人穿涼鞋為事件 X=x1 ,未穿涼鞋為事件 X=x0 。而一個人的性別與是否穿涼鞋這兩個事件之間是相互獨立的。于是我們可以看到該例子中存在四個先驗概率:

        由于男女生的比例是2:1,那么P(Y=ymen)自然等于2/3,P(Y=ywomen)同理。而先驗概率 P(Y=ymen)與P(Y=ywomen) 并不能直接得出,需要根據(jù)全概率公式來求解。在學習全概率公式之前,我們先了解一下條件概率。


        條件概率


        條件概率是指在事件 Y=y 已經(jīng)發(fā)生的條件下,事件 X=x 發(fā)生的概率。條件概率可表示為:P(X=x|Y=y) 。而條件概率計算公式為:

        其中 P(X=x,Y=y) 是聯(lián)合概率,也就是兩個事件共同發(fā)生的概率。而 P(Y=y)以及P(X=x) 是先驗概率。我們用例子來說明一下就是:“某公園男性穿涼鞋的概率為 1/2 ”,也就是說“是男性的前提下,穿涼鞋的概率是 1/2 ”,此概率為條件概率,即 P(X=x1|Y=ymen)=1/2 。同理“女性穿涼鞋的概率為 2/3 ” 為條件概率 P(X=x1|Y=ywomen)=1/2 。


        全概率公式是指:如果事件 Y=y1,Y=y2,...,Y=yn 可構成一個完備事件組,即它們兩兩互不相容,其和為全集。則對于事件 X=x 有:

        因此對于上面的例子,我們可以根據(jù)全概率公式求得:

        也就是說不考慮性別的情況下,公園中穿拖鞋的概率為 5/9 ,不穿拖鞋的概率為 4/9 。


        后驗概率


        后驗概率是指,某事件 X=x 已經(jīng)發(fā)生,那么該事件是因為事件 Y=y 的而發(fā)生的概率。也就是上例中所需要求解的“在知道一個人穿拖鞋的前提下,這個人是男性的概率或者是女性的概率是多少”。后驗概率形式化便是:

        后驗概率的計算要以先驗概率為基礎。后驗概率可以根據(jù)通過貝葉斯公式,用先驗概率和似然函數(shù)計算出來。

        貝葉斯公式如下:

        說明:分母的變形是使用全概率公式,Y事件取值范圍為:{men, women},即男生和女生;分子的變現(xiàn)是根據(jù)獨立條件概率(貝葉斯定理):

        兩邊同時除以P(B)得到,上節(jié)有證明?貝葉斯定理的通俗理解。


        根據(jù)前面的約定,X=x1表示穿穿拖鞋,Y=ymen?表示男生,該公式即為,穿拖鞋情況下,是男生的概率,正式題目需要我們求的。

        而樸素貝葉斯算法正是利用以上信息求解后驗概率,并依據(jù)后驗概率的值來進行分類。使用上面的例子來進行理解,將先驗概率和條件概率帶入得,后驗概率為:


        即,在x1(一個人穿拖鞋的情況下),是男生概率是3/5,是女生的概率為2/5,那么,對于分類情況,作為單選題的話,我們有理由將這個人歸類為男性,因為是男性的概率大些。


        樸素貝葉斯


        對于樣本集:

        其中 m 表示有 m 個樣本, n 表示有 n 個特征。yi,i=1,2,..,m 表示樣本類別,取值為 {C1,C2,...,CK} 。

        (怎么理解呢,yi?我們可以理解為前例的男生,女生,特征可以看成,穿拖鞋)

        樸素貝葉斯分類的基本公式


        化簡一下,樸素貝葉斯分類器可表示為:



        樸素貝葉斯算法過程


        1)計算先驗概率:求出樣本類別的個數(shù) K 。對于每一個樣本 Y=Ck ,計算出 P(Y=Ck) 。其為類別 Ck 在總樣本集中的頻率(對于前例男生女生,k=2,男生概率,女生概率)

        2)計算條件概率:將樣本集劃分成 K 個子樣本集,分別對屬于 Ck 的子樣本集進行計算,計算出其中特征 Xj=ajl 的概率:P(Xj=ajl|Y=Ck)。其為該子集中特征取值為 ajl 的樣本數(shù)與該子集樣本數(shù)的比值。(前例中,穿拖鞋與否就是一個特征,對于男生,需要計算穿拖鞋的條件概率,女生也一樣)

        3)針對待預測樣本 xtest ,計算其對于每個類別 Ck 的后驗概率:

        計算結果,概率值最大的類別即為待預測樣本的預測類別。(前例中,由于計算出來,男生概率大,對于分類問題,我們認為是男生)



        樸素貝葉斯算法分析


        優(yōu)點:

        (1)樸素貝葉斯模型發(fā)源于古典數(shù)學理論,有穩(wěn)定的分類效率。

        (2)對小規(guī)模的數(shù)據(jù)表現(xiàn)很好,能個處理多分類任務,適合增量式訓練,尤其是數(shù)據(jù)量超出內(nèi)存時,我們可以一批批的去增量訓練。

        (3)對缺失數(shù)據(jù)不太敏感,算法也比較簡單,常用于文本分類。

        缺點:

        (1)理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上并非總是如此,這是因為樸素貝葉斯模型給定輸出類別的情況下,假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數(shù)比較多或者屬性之間相關性較大時,分類效果不好。而在屬性相關性較小時,樸素貝葉斯性能最為良好。對于這一點,有半樸素貝葉斯之類的算法通過考慮部分關聯(lián)性適度改進。

        (2)需要知道先驗概率,且先驗概率很多時候取決于假設,假設的模型可以有很多種,因此在某些時候會由于假設的先驗模型的原因?qū)е骂A測效果不佳。

        (3)由于我們是通過先驗和數(shù)據(jù)來決定后驗的概率從而決定分類,所以分類決策存在一定的錯誤率。

        (4)對輸入數(shù)據(jù)的表達形式很敏感。



        垃圾郵件分類實現(xiàn)


        樸素貝葉斯 (naive Bayes) 法是基于貝葉斯定理與特征條件獨立假設的分類的方法。對于給定的訓練數(shù)據(jù)集,首先基于特征條件獨立假設學習輸入/輸出的聯(lián)合概率分布;然后基于此模型,對于給定的輸入x" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial;">x,利用貝葉斯定理求出后驗概率最大的輸出y,完整代碼GitHub。

        輸入:

        #垃圾郵件的內(nèi)容
        posting_list = [
        ['my', 'dog', 'has', 'flea', 'problem', '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', 'ny', 'steak', 'how', 'to', 'stop', 'him'],
        ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']
        ]
        #是否是垃圾郵件的標簽
        labels = [0, 1, 0, 1, 0, 1]

        首先得根據(jù)上述文本建立一個詞匯表,即把重復的詞匯剔除。代碼如下:

        def createVocabList(dataSet):
        '''
        創(chuàng)建所有文檔中出現(xiàn)的不重復詞匯列表
        Args:
        dataSet: 所有文檔
        Return:
        包含所有文檔的不重復詞列表,即詞匯表
        '''

        vocabSet = set([])
        # 創(chuàng)建兩個集合的并集
        for document in dataSet:
        vocabSet = vocabSet | set(document)
        return list(vocabSet)

        然后需要把每句話轉化為詞袋模型(bag-of-words model)

        # 詞袋模型(bag-of-words model):詞在文檔中出現(xiàn)的次數(shù)
        def bagOfWords2Vec(vocabList, inputSet):
        '''
        依據(jù)詞匯表,將輸入文本轉化成詞袋模型詞向量
        Args:
        vocabList: 詞匯表
        inputSet: 當前輸入文檔
        Return:
        returnVec: 轉換成詞向量的文檔
        例子:
        vocabList = ['I', 'love', 'python', 'and', 'machine', 'learning']
        inputset = ['python', 'machine', 'learning', 'python', 'machine']
        returnVec = [0, 0, 2, 0, 2, 1]
        長度與詞匯表一樣長,出現(xiàn)了的位置為1,未出現(xiàn)為0,如果詞匯表中無該單詞則print
        '''

        returnVec = [0] * len(vocabList)
        for word in inputSet:
        if word in vocabList:
        returnVec[vocabList.index(word)] += 1
        else:
        print("the word: %s is not in my vocabulary!" % word)
        return returnVec

        目前為止,我們把每份郵件轉化成了一系列的向量形式,向量的長度是詞表里面的詞的個數(shù),是稀疏矩陣。

        接下去就是樸素貝葉斯的步驟了,也就是訓練的過程:

        def fit(self, trainMatrix, trainCategory):
        '''
        樸素貝葉斯分類器訓練函數(shù),求:p(Ci),基于詞匯表的p(w|Ci)
        Args:
        trainMatrix : 訓練矩陣,即向量化表示后的文檔(詞條集合)
        trainCategory : 文檔中每個詞條的列表標注
        Return:
        p0Vect : 屬于0類別的概率向量(p(w1|C0),p(w2|C0),...,p(wn|C0))
        p1Vect : 屬于1類別的概率向量(p(w1|C1),p(w2|C1),...,p(wn|C1))
        pAbusive : 屬于1類別文檔的概率
        '''

        numTrainDocs = len(trainMatrix)
        # 長度為詞匯表長度
        numWords = len(trainMatrix[0])
        # p(ci)
        self.pAbusive = sum(trainCategory) / float(numTrainDocs)
        # 由于后期要計算p(w|Ci)=p(w1|Ci)*p(w2|Ci)*...*p(wn|Ci),若wj未出現(xiàn),則p(wj|Ci)=0,因此p(w|Ci)=0,這樣顯然是不對的
        # 故在初始化時,將所有詞的出現(xiàn)數(shù)初始化為1,分母即出現(xiàn)詞條總數(shù)初始化為2
        p0Num = np.ones(numWords)
        p1Num = np.ones(numWords)
        p0Denom = 2.0
        p1Denom = 2.0
        for i in range(numTrainDocs):
        if trainCategory[i] == 1:
        p1Num += trainMatrix[i]
        p1Denom += sum(trainMatrix[i])
        else:
        p0Num += trainMatrix[i]
        p0Denom += sum(trainMatrix[i])
        # p(wi | c1)
        # 為了避免下溢出(當所有的p都很小時,再相乘會得到0.0,使用log則會避免得到0.0)
        self.p1Vect = np.log(p1Num / p1Denom)
        # p(wi | c2)
        self.p0Vect = np.log(p0Num / p0Denom)
        return self

        訓練完了,剩下的是對新數(shù)據(jù)的預測過程:

        def predict(self, testX):
        '''
        樸素貝葉斯分類器
        Args:
        testX : 待分類的文檔向量(已轉換成array)
        p0Vect : p(w|C0)
        p1Vect : p(w|C1)
        pAbusive : p(C1)
        Return:
        1 : 為侮辱性文檔 (基于當前文檔的p(w|C1)*p(C1)=log(基于當前文檔的p(w|C1))+log(p(C1)))
        0 : 非侮辱性文檔 (基于當前文檔的p(w|C0)*p(C0)=log(基于當前文檔的p(w|C0))+log(p(C0)))
        '''


        p1 = np.sum(testX * self.p1Vect) + np.log(self.pAbusive)
        p0 = np.sum(testX * self.p0Vect) + np.log(1 - self.pAbusive)
        if p1 > p0:
        return 1
        else:
        return 0
        下載1:OpenCV-Contrib擴展模塊中文版教程
        在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實戰(zhàn)項目52講
        小白學視覺公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。

        下載3:OpenCV實戰(zhàn)項目20講
        小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

        交流群


        歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


        瀏覽 32
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲射 | 女主被各种怪物啪h | 人人色淫欲网 | 免费操逼毛片 | 嘘嘘特写合集av 啊日出水了用力乖乖视频 大学生交换做爰3在线观看 | 熟女人妻人妻の视频 | 美女扒开大腿让男人桶 | 用力挺进她的花苞啊太视频 | 天堂麻豆| 美女肏逼|