1. 程式人生 > >樸素貝葉斯演算法原理小結

樸素貝葉斯演算法原理小結

    在所有的機器學習分類演算法中,樸素貝葉斯和其他絕大多數的分類演算法都不同。對於大多數的分類演算法,比如決策樹,KNN,邏輯迴歸,支援向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函式$Y=f(X)$,要麼是條件分佈$P(Y|X)$。但是樸素貝葉斯卻是生成方法,也就是直接找出特徵輸出Y和特徵X的聯合分佈$P(X,Y)$,然後用$P(Y|X) = P(X,Y)/P(X)$得出。

    樸素貝葉斯很直觀,計算量也不大,在很多領域有廣泛的應用,這裡我們就對樸素貝葉斯演算法原理做一個小結。

1. 樸素貝葉斯相關的統計學知識

    在瞭解樸素貝葉斯的演算法之前,我們需要對相關必須的統計學知識做一個回顧。

    貝葉斯學派很古老,但是從誕生到一百年前一直不是主流。主流是頻率學派。頻率學派的權威皮爾遜和費歇爾都對貝葉斯學派不屑一顧,但是貝葉斯學派硬是憑藉在現代特定領域的出色應用表現為自己贏得了半壁江山。

    貝葉斯學派的思想可以概括為先驗概率+資料=後驗概率。也就是說我們在實際問題中需要得到的後驗概率,可以通過先驗概率和資料一起綜合得到。資料大家好理解,被頻率學派攻擊的是先驗概率,一般來說先驗概率就是我們對於資料所在領域的歷史經驗,但是這個經驗常常難以量化或者模型化,於是貝葉斯學派大膽的假設先驗分佈的模型,比如正態分佈,beta分佈等。這個假設一般沒有特定的依據,因此一直被頻率學派認為很荒謬。雖然難以從嚴密的數學邏輯裡推出貝葉斯學派的邏輯,但是在很多實際應用中,貝葉斯理論很好用,比如垃圾郵件分類,文字分類。

    我們先看看條件獨立公式,如果X和Y相互獨立,則有:

$$P(X,Y) =P(X)P(Y)$$

    我們接著看看條件概率公式:

$$P(Y|X) = P(X,Y)/P(X)$$

$$P(X|Y) = P(X,Y)/P(Y)$$

或者說:

$$ P(Y|X) = P(X|Y)P(Y)/P(X)$$

接著看看全概率公式

$$P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1$$

從上面的公式很容易得出貝葉斯公式:

$$P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}$$

 2. 樸素貝葉斯的模型

    從統計學知識回到我們的資料分析。假如我們的分類模型樣本是:$$(x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)$$

    即我們有m個樣本,每個樣本有n個特徵,特徵輸出有K個類別,定義為${C_1,C_2,...,C_K}$。

    從樣本我們可以學習得到樸素貝葉斯的先驗分佈$P(Y=C_k)(k=1,2,...K)$,接著學習到條件概率分佈$P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$,然後我們就可以用貝葉斯公式得到X和Y的聯合分佈P(X,Y)了。聯合分佈P(X,Y)定義為:

$$ \begin{align} P(X,Y=C_k)  &= P(Y=C_k)P(X=x|Y=C_k) \\&= P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) \end{align}$$

    從上面的式子可以看出$ P(Y=C_k)$比較容易通過最大似然法求出,得到的$ P(Y=C_k)$就是類別$C_k$在訓練集裡面出現的頻數。但是$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$很難求出,這是一個超級複雜的有n個維度的條件分佈。樸素貝葉斯模型在這裡做了一個大膽的假設,即X的n個維度之間相互獨立,這樣就可以得出:

$$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) = P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k)$$

    從上式可以看出,這個很難的條件分佈大大的簡化了,但是這也可能帶來預測的不準確性。你會說如果我的特徵之間非常不獨立怎麼辦?如果真是非常不獨立的話,那就儘量不要使用樸素貝葉斯模型了,考慮使用其他的分類方法比較好。但是一般情況下,樣本的特徵之間獨立這個條件的確是弱成立的,尤其是資料量非常大的時候。雖然我們犧牲了準確性,但是得到的好處是模型的條件分佈的計算大大簡化了,這就是貝葉斯模型的選擇。

    最後回到我們要解決的問題,我們的問題是給定測試集的一個新樣本特徵$(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}$,我們如何判斷它屬於哪個型別?

    既然是貝葉斯模型,當然是後驗概率最大化來判斷分類了。我們只要計算出所有的K個條件概率$P(Y=C_k|X=X^{(test)})$,然後找出最大的條件概率對應的類別,這就是樸素貝葉斯的預測了。

3. 樸素貝葉斯的推斷過程

    上節我們已經對樸素貝葉斯的模型也預測方法做了一個大概的解釋,這裡我們對樸素貝葉斯的推斷過程做一個完整的詮釋過程。

    我們預測的類別$C_{result}$是使$P(Y=C_k|X=X^{(test)})$最大化的類別,數學表示式為:

$$ \begin{align} C_{result}  & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\& = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \Bigg{/}P(X=X^{(test)}) \end{align}$$

    由於對於所有的類別計算$P(Y=C_k|X=X^{(test)})$時,上式的分母是一樣的,都是$P(X=X^{(test)}$,因此,我們的預測公式可以簡化為:

$$  C_{result}  = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) $$   

    接著我們利用樸素貝葉斯的獨立性假設,就可以得到通常意義上的樸素貝葉斯推斷公式:

$$  C_{result}  = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) $$

4. 樸素貝葉斯的引數估計

    在上一節中,我們知道只要求出$P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,我們通過比較就可以得到樸素貝葉斯的推斷結果。這一節我們就討論怎麼通過訓練集計算這兩個概率。

    對於$P(Y=C_k)$,比較簡單,通過極大似然估計我們很容易得到$P(Y=C_k)$為樣本類別$C_k$出現的頻率,即樣本類別$C_k$出現的次數$m_k$除以樣本總數m。

    對於$P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,這個取決於我們的先驗條件:

    a) 如果我們的$X_j$是離散的值,那麼我們可以假設$X_j$符合多項式分佈,這樣得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在樣本類別$C_k$中,特徵$X_j^{(test)}$出現的頻率。即:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k}$$

    其中$m_k$為樣本類別$C_k$總的特徵計數,而$m_{kj^{test}}$為類別為$C_k$的樣本中,第j維特徵$X_j^{(test)}$出現的計數。

    某些時候,可能某些類別在樣本中沒有出現,這樣可能導致$P(X_j=X_j^{(test)}|Y=C_k)$為0,這樣會影響後驗的估計,為了解決這種情況,我們引入了拉普拉斯平滑,即此時有:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda}$$   

    其中$\lambda$ 為一個大於0的常數,常常取為1。$O_j$為第j個特徵的取值個數。

    b)如果我們我們的$X_j$是非常稀疏的離散值,即各個特徵出現概率很低,這時我們可以假設$X_j$符合伯努利分佈,即特徵$X_j$出現記為1,不出現記為0。即只要$X_j$出現即可,我們不關注$X_j$的次數。這樣得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在樣本類別$C_k$中,$X_j^{(test)}$出現的頻率。此時有:

$$P(X_j=X_j^{(test)}|Y=C_k) = P(X_j|Y=C_k)X_j^{(test)} + (1 - P(X_j|Y=C_k))(1-X_j^{(test)})$$

    其中,$X_j^{(test)}$取值為0和1。

    c)如果我們我們的$X_j$是連續值,我們通常取$X_j$的先驗概率為正態分佈,即在樣本類別$C_k$中,$X_j$的值符合正態分佈。這樣$P(X_j=X_j^{(test)}|Y=C_k)$的概率分佈是:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(X_j^{(test)} - \mu_k)^2}{2\sigma_k^2}\Bigg{)}$$

    其中$\mu_k和\sigma_k^2$是正態分佈的期望和方差,可以通過極大似然估計求得。$\mu_k$為在樣本類別$C_k$中,所有$X_j$的平均值。$\sigma_k^2$為在樣本類別$C_k$中,所有$X_j$的方差。對於一個連續的樣本值,帶入正態分佈的公式,就可以求出概率分佈了。

5.  樸素貝葉斯演算法過程

    我們假設訓練集為m個樣本n個維度,如下:

$$(x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)$$

    共有K個特徵輸出類別,分別為${C_1,C_2,...,C_K}$,每個特徵輸出類別的樣本個數為${m_1,m_2,...,m_K}$,在第k個類別中,如果是離散特徵,則特徵$X_j$各個類別取值為$m_{jl}$。其中l取值為$1,2,...S_j$,$S_j$為特徵j不同的取值數。

    輸出為例項$X^{(test)}$的分類。

    演算法流程如下:

    1) 如果沒有Y的先驗概率,則計算Y的K個先驗概率:$P(Y=C_k) = (m_k+\lambda)/(m+K\lambda)$,否則$P(Y=C_k)$為輸入的先驗概率。

    2) 分別計算第k個類別的第j維特徵的第l個個取值條件概率:$P(X_j=x_{jl}|Y=C_k)$

      a)如果是離散值:

$$P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda}$$

      $\lambda$可以取值為1,或者其他大於0的數字。

      b)如果是稀疏二項離散值:$$P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) $$

       此時$l$只有兩種取值。

      c)如果是連續值不需要計算各個l的取值概率,直接求正態分佈的引數:

$$P(X_j=x_j|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(x_j - \mu_k)^2}{2\sigma_k^2}\Bigg{)}$$

      需要求出$\mu_k和\sigma_k^2$。 $\mu_k$為在樣本類別$C_k$中,所有$X_j$的平均值。$\sigma_k^2$為在樣本類別$C_k$中,所有$X_j$的方差。

    3)對於例項$X^{(test)}$,分別計算:

$$P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) $$

    4)確定例項$X^{(test)}$的分類$C_{result}$

$$C_{result}  = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) $$

     從上面的計算可以看出,沒有複雜的求導和矩陣運算,因此效率很高。

6.  樸素貝葉斯演算法小結

    樸素貝葉斯演算法的主要原理基本已經做了總結,這裡對樸素貝葉斯的優缺點做一個總結。

    樸素貝葉斯的主要優點有:

    1)樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。

    2)對小規模的資料表現很好,能個處理多分類任務,適合增量式訓練,尤其是資料量超出記憶體時,我們可以一批批的去增量訓練。

    3)對缺失資料不太敏感,演算法也比較簡單,常用於文字分類。

    樸素貝葉斯的主要缺點有:   

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

    2)需要知道先驗概率,且先驗概率很多時候取決於假設,假設的模型可以有很多種,因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳。

    3)由於我們是通過先驗和資料來決定後驗的概率從而決定分類,所以分類決策存在一定的錯誤率。

    4)對輸入資料的表達形式很敏感。     以上就是樸素貝葉斯演算法的一個總結,希望可以幫到朋友們。 (歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected]) 

相關推薦

樸素演算法原理小結

    在所有的機器學習分類演算法中,樸素貝葉斯和其他絕大多數的分類演算法都不同。對於大多數的分類演算法,比如決策樹,KNN,邏輯迴歸,支援向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函式$Y=f(X)$,要麼是條件分佈$P(Y|X)$。但是樸素貝葉斯卻是生成方法,也就

樸素演算法原理

(作者:陳玓玏) 1. 損失函式 假設我們使用0-1損失函式,函式表示式如下: Y Y Y為真實

樸素演算法原理及Scala實現

樸素貝葉斯分類器基於一個簡單的假定:給定目標值時屬性之間相互條件獨立。 P( Category | Document) = P ( Document | Category ) * P( Category) / P(Document) 更多學習其理論可以參看:

寫程式學ML:樸素演算法原理及實現(一)

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、樸素貝葉斯演算法的原理 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。 和決策樹模型相比,樸素貝葉斯

帶你搞懂樸素演算法原理

一、樸素貝葉斯是什麼,怎麼用? 貝葉斯定理:樸素貝葉斯定理體現了後驗概率 P(y|x)P(y|x) 、先驗概率 P(y)P(y) 、條件概率 P(x|y)P(x|y) 之間的關係: P(y|x)=P(x,y)P(x)=P(x|y)⋅P(y)

寫程式學ML:樸素演算法原理及實現(二)

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 2、樸素貝葉斯演算法的實現 2.1   樸素貝葉斯演算法的實現 按照樸素貝葉斯演算法的原理,我們需要實現一個樸素貝葉

機器學習數學原理(4)——樸素演算法

機器學習數學原理(4)——樸素貝葉斯模型 樸素貝葉斯模型(Naive Bayes Model),是一種基於貝葉斯定理與特徵條件獨立假設的分類方法,與決策樹模型(Decision Tree Model)同為目前使用最廣泛的分類模型之一,在各個領域都有廣泛的應用,例如我們經常會用到的垃圾

小白python學習——機器學習篇——樸素演算法

一.大概思路: 1.找出資料集合,所有一個單詞的集合,不重複,各個文件。 2.把每個文件換成0,1模型,出現的是1,就可以得到矩陣長度一樣的各個文件。 3.計算出3個概率,一是侮辱性的文件概率,二是侮辱性文件中各個詞出現的概率,三是非侮辱性文件中各個詞出現的概率。 4.二、三計算方法

樸素演算法應用——垃圾簡訊分類

理解貝葉斯公式其實就只要掌握:1、條件概率的定義;2、乘法原理 P (

機器學習——樸素演算法

概率定義為一件事情發生的可能性 概率分為聯合概率和條件概率  聯合概率:包含多個條件,且所有條件同時成立的概率 記作:P(A,B)  P(A,B)=P(A)P(B) 條件概率:就是事件A在另外一個事件B已經發生的條件概率 記作:P(A|B)  

機器學習實踐(九)—sklearn之樸素演算法

一、樸素貝葉斯演算法 什麼是樸素貝葉斯分類方法 屬於哪個類別概率大,就判斷屬於哪個類別 概率基礎 概率定義為一件事情發生的可能性 P(X) : 取值在[0, 1] 聯合概率、條件概率與相互獨立

樸素演算法優化與 sklearn 實現

1. 引言 上一篇日誌中,我們主要介紹了貝葉斯演算法,並提供了 python 實踐: 樸素貝葉斯演算法的推導與實踐 但執行上一篇日誌中的示例,我們發現出現了下面的結果: ['love', 'my', 'dalmation'] 屬於非侮辱類 ['stu

樸素演算法的推導與實踐

1. 概述 在此前的文章中,我們介紹了用於分類的演算法: k 近鄰演算法 決策樹的構建演算法 – ID3 與 C4.5 演算法 但是,有時我們無法非常明確地得到分類,例如當資料量非常大時,計算每個樣本與預測樣本之間的距

機器學習——樸素演算法Python實現

簡介 這裡參考《統計學習方法》李航編進行學習總結。詳細演算法介紹參見書籍,這裡只說明關鍵內容。 即 條件獨立下:p{X=x|Y=y}=p{X1=x1|Y=y} * p{X2=x2|Y=y} *...* p{Xn=xn|Y=y} (4.4)等價於p{Y=ck|X=x

第3章 樸素演算法 (二 演算法實戰)

3.6樸素貝葉斯實踐 3.6.1樸素貝葉斯之微博評論篩選 以微博評論為例。為了不影響微博的發展,我們要遮蔽低俗的言論,所以要構建一個快速過濾器,如果某條評論使用了負面或者侮辱性等低俗的語言,那麼就將該留言標誌為內容不當。過濾這類內容是一個很常見的需求。對此問題建

機器學習樸素演算法

樸素貝葉斯屬於監督學習的生成模型,實現簡單,沒有迭代,學習效率高,在大樣本量下會有較好表現。但因為假設太強——特徵條件獨立,在輸入向量的特徵條件有關聯的場景下,並不適用。 樸素貝葉斯演算法:主要思路是通過聯合概率建模,運用貝葉斯定理求解後驗概率;將後驗概率最大者對應的類別作

【ML學習筆記】樸素演算法的demo(機器學習實戰例子)

礙於這學期課程的緊迫,現在需要儘快從課本上掌握一些ML演算法,我本不想經過danger zone,現在看來卻只能儘快進入danger zone,數學理論上的缺陷只能後面找時間彌補了。 如果你在讀這篇文章,希望你不要走像我一樣的道路,此舉實在是出於無奈,儘量不要去做一個心

樸素演算法的python實現

import numpy as np import re #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please']

2.樸素演算法

樸素貝葉斯程式碼(原理很簡單) 直接上程式碼 import numpy as np from collections import Counter,defaultdict class Nbayes: def __init__(self): self

樸素演算法-My way of ML7

預備知識 聯合概率:包含多個條件,所有條件同時成立概率P(A,B)=P(A)P(B) 條件概率:事件A發生在事件B發生的條件之下的概率。所有的特徵值無關的時候才能適用條件概率 樸素貝葉斯的前提是: 特徵條件獨立,哈哈,這也是她被叫做樸素的原因,因為特徵之間很難獨