歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

樸素貝葉斯分類算法

之前有次考試考的是手工計算樸素貝葉斯的分類。當時沒答對,後來搞明白了,不久又忘得差不多了。所以寫個例子在這兒記一下。

先推導一下貝葉斯公式:

假定我們觀察到兩個事件都發生了,記做P(A∙B),那麼我們既可以認為先發生了事件A,在此基礎上又發生了事件B,也可以認為先發生了事件B,在此基礎上又發生了事件A。所以這兩個事件發生的概率,可以記做P(A∙B)=P(A|B)*P(B) 和 P(B∙A)=P(B|A)*P(A),其中P(A|B)、P(B|A)是條件概率,意思是在B事件的條件下又發生A的概率及在A事件的條件下又發生B的概率,那麼顯然P(A∙B)= P(B∙A),所以這兩個公式合並就成了P(A|B)*P(B)=P(B|A)*P(A),再變形一下即得到P(A|B)=P(B|A)*P(A)/P(B)或者P(B|A)= P(A|B)*P(B)/P(A)。防止公式看花眼,只拿其中一個舉例。

P(B|A)=P(A|B)*P(B)/P(A),觀察等式兩邊,先不管P(A)和P(B),一邊是P(B|A),一邊是P(A|B),意味著如果我們知道了P(A)和P(B),那麼就可以對兩個條件概率進行互算。這正是樸素貝葉斯算法的理論基礎——根據已有數據的概率預測新數據的概率,舉個例子見表格:

 

觀測項

類別(假定只有兩類)

 

已有數據1

000

C1

已知P(觀測項|類別)——可以算出各類別條件下某觀測項的概率

已有數據2

001

C1

已有數據3

010

C1

已有數據4

011

C2

已有數據5

100

C1

已有數據6

101

C1

已有數據7

110

C2

… …

… …

… …

 

新數據

111

計算P(類別|觀測項)——某觀測項條件下各類別的概率,並選取最大概率那個類別作為“預測”結果

那再回到公式,P(A)和P(B)是否可知呢?當然是可知的,因為我們已有數據的數量是有限的,在這個數量中求某一觀測項的概率或者某一類別的概率就是個簡單的除法。而且並不需要計算P(A),我們只是要比較哪個類別的概率更大,分母相同,只計算分子,看哪個大就可以了。

以上表的7條已知數據為例:P(C1)=5/7;P(C2)=2/7;

P(000|C1)=1/5、P(001|C1)=1/5、P(010|C1)=1/5、P(011|C2)=1/2、P(100|C1)=1/5、P(101|C1)=1/5、P(110|C2)=1/2,這些都可以算出來。理想情況下我們要分別計算P(C1|111)和P(C2|111)的概率並比較二者大小。P(C1|111)= P(111|C1)*P(C1)/P(111);P(C2|111)= P(111|C2)*P(C2)/P(111),分母相同不去管,只計算並比較P(111|C1)*P(C1)和P(111|C2)*P(C2)。P(C1)、P(C2)有了,然而P(111|C1)和P(111|C2)都沒有,等於0。說明這是一條從沒出現過的“純”新數據。這種情況其實是很常見的,但是0乘以任何數都是0,0和0怎麼比較大小呢。所以應對這種情況,常用一種叫做Laplace平滑的方法,就是假設已知數據裡每個類別下至少有一條這樣的數據。看起來有些粗暴,但當數據量較大時幾乎是不影響結果的正確性的。這樣一來,P(C1|111)=P(111|C1)*P(C1)=1/6*5/7=0.12、P(C2|111)=P(111|C2)*P(C2)=1/3*2/7=0.09,0.12>0.09,以此推斷111屬於C1類。事實上我在設計上面的數據時改了好幾次,因為數據量實在太小,即便+1也會對結果造成影響。這個完全的新數據111被預測為C1類,那麼從邏輯上是否講的通呢?只能說有一點兒,畢竟通過觀察我們發現大部分(5/7)的數據都是C1類,那麼來一條沒有任何“跡象”的新數據我們也只能往可能性最大的類別裡分。

在實際應用中,我們的觀測項往往並非一項,也就是說,表格多半是這樣的:

 

觀測項1

觀測項2

觀測項3

類別

 

已有數據1

000

M

C1

已知P(觀測項|類別)——可以算出各類別條件下某觀測項的概率

已有數據2

001

A

C1

已有數據3

010

A

C1

已有數據4

011

M

C2

已有數據5

100

A

C1

已有數據6

101

A

C1

已有數據7

110

M

C2

… …

… …

 

 

… …

 

新數據

111

A

計算P(類別|觀測項)——某觀測項條件下各類別的概率,並選取最大概率那個類別作為“預測”結果

計算P(C1|111∙○∙A)和P(C2|111∙○∙A)需要用到P(111∙○∙A|C1)和P(111∙○∙A|C2),此時應用樸素貝葉斯算法,我們需要一個先決條件——各觀測項相互獨立、沒有關聯關系。因為如果相互獨立,就可以把概率公式拆分成這樣:P(111∙○∙A|C1)=P(111|C1)*P(○|C1)*P(A|C1),這樣算起來會更容易,而且更少出現等於0的情況。

P(C1|111∙○∙A)= P(111∙○∙A|C1)*P(C1)= P(111|C1)*P(○|C1)*P(A|C1)*P(C1)=1/6*4/5*4/5*5/7=0.076

P(C2|111∙○∙A)= P(111∙○∙A|C2)*P(C2)= P(111|C2)*P(○|C2)*P(A|C2)*P(C2)=1/3*1/2*1/3*2/7=0.016

C1類比C2類概率大多了,自然預測為C1類。肉眼觀察也能有這樣感覺:雖然111沒有在觀測項1裡出現過,但大部分○和大部分A都屬於C1類,那麼這條新數據屬於C1類的可能性也很大。這就是三個觀測項相互獨立並共同作用於結果的情況。

實際類別是什麼呢?那就沒人知道了。其實我在設計第一個表格的時候預想的規則是這樣的:只有連著兩個1以上的數字是C2類,否則就是C1類。可見算法是很難猜測規則的,尤其訓練數據量少的時候。我們只能在已有數據上多嘗試幾種算法,多試驗一些參數,評估正確率最高的算法,再應用到未來的數據上去。

Copyright © Linux教程網 All Rights Reserved