1. 程式人生 > >貝葉斯分類器的簡單理解

貝葉斯分類器的簡單理解

貝葉斯分類器 貝葉斯分類器的分類原理是通過某物件的先驗概率,利用貝葉斯公式計算出其後驗概率,即該物件屬於某一類的概率,選擇具有最大後驗概率的類作為該物件所屬的類。也就是說,貝葉斯分類器是最小錯誤率意義上的優化。目前研究較多的貝葉斯分類器主要有四種,分別是:Naive Bayes、TAN、BAN和GBN。 訓練 和所有監督演算法一樣,貝葉斯分類器是利用樣本進行訓練的,每個樣本包含了一個特徵列表和對應的分類。假定我們要對一個分類器進行訓練,使其能夠正確的判斷出:一個包含"python"的文件究竟是程式語言的,還是關於蛇的。
特徵                                分類
Python是以鳥和哺乳動物為食的大蟒
Python最初是作為一門指令碼語言被開發出來的 語言
在印度尼西亞發現了一條14.935米長的Python
Python具有動態型別的系統 語言
擁有鮮豔表皮的Python
開源專案                                 語言
   分類器記錄了它迄今為止見過的所有特徵,以及這些特徵與某個特定分類相關的數字概率。分類器逐一接受樣本的訓練。 當經過某個樣本的訓練之後,分類器會更新該樣本中特徵與分類的概率,同時還會生成一個新的概率,即:在一篇屬於某個分類的文件中,含有指定單詞的概率。例如
特徵                    語言                  蛇                  
dynamic 0.6 0.1
constrictor 0.0 0.6
long 0.1 0.2
source 0.3 0.1
and 0.95 0.95
從上表中我們可以看到,經過訓練之後,特徵與各種分類的關聯性更加明確了。單詞"constrictor"屬於蛇的分類概率更大,而單詞"dynamic"屬於程式語言的概率更大。 另一方便,有些特徵的所屬分類則沒有那麼明確。比如:單詞"and"出現在兩個分類中的概率是差不多的(單詞and幾乎會出現在每一篇文件中,不管它屬於哪一個分類。)分類器在經過訓練之後。只會保留一個附有相應概率的特徵列表,與某些其他的分類方法不同,此處的原始資料在訓練之後,就沒有必要再加以儲存了。 分類
當一個貝葉斯分類器經過訓練之後,我們就可以利用它來對新的專案進行自動分類了。假定我們有一篇新的文件,包含了“long” “dynamic” 和 “source”。 樸素貝葉斯分類器是通過下面的公式將概率組合起來的: P( Category | Document) = P ( Document | Category ) * P( Category) / P(Document) 此處: P( Document  | Category) = P (Word1 | Category ) * P( Word2) / P(Category  ) pDocument  | Category) 的取值來自於上表,比如 P( dynamic  | language) = 0.6 p(Category) 的取值則等於某個分類出現的總體概率,因為" language " 有一般的機會都會出現,所以 P(language ) 的值為0.5 。無論是哪個分類,只要其P( Category | Document) 的值相對較高,它就是我們預期的分類。 ---- 我們需要一個定義一個特徵提取函式,該函式的作用是將我們用以訓練或分類的資料轉化成一個特徵列表。 docclass.getwords('python is a dynamic language') {'python':1,'dymaic':1,'language':1} 上述函式可用於建立一個新的分類器,針對字串進行訓練: cl = docclass.nativebayes(docclass.getwords) cl.setdb('test.db') cl.train('pythons are constrictors','snake') cl.train('python has dynamic types','language') cl.train('python was developed as a scripting language','language') 然後進行分類 cl.classify('dynamic programming') u'language' cl.classify('boa constrictors') u'snake' 對於允許使用的分類數量,此處並沒有任何的限制,但是為了使分類器有一個良好的表現,我們需要為每個分類提供大量的樣本。 優點和缺點 樸素貝葉斯分類器與其他方法相比最大的優勢或許就在於,它在接受大資料量訓練和查詢時所具備的的高速度。即使選用超大規模的訓練集,針對每個專案通常也只會有相對較少的特徵數,並且對專案的訓練和分類頁僅僅是針對特徵概率的數學運算而已。 尤其當訓練量逐漸遞增時則更加如此--在不借助任何舊有訓練資料的前提下,每一組新的訓練資料都有可能會引起概率值變化。對於一個如垃圾郵件過濾這樣的應用程式而言,支援增量式訓練的能力是非常重要的,因為過濾程式時常要對新到的郵件進行訓練,然後必須即可進行相應的調整;更何況,過濾程式也未必有許可權訪問已經收到的所有郵件資訊。 樸素貝葉斯分類器的另一大優勢是,對分類器實際學習狀況的解釋還是相對簡單的。由於每個特徵的概率值都被儲存了起來,因此我們可以在任何時候檢視資料庫,找到最合適的特徵來區分垃圾郵件和非垃圾郵件,或是程式語言和蛇。儲存在資料庫中的這些資訊都很有價值,它們有可能被用於其他的應用程式,或者作為構築這些應用程式的一個良好基礎。 樸素貝葉斯分類器的最大缺陷就是,它無法處理基於特徵組合所產生的變化結果。假設有如下這樣一個場景,我們正在嘗試從非垃圾郵件中鑑別出垃圾郵件來:假設我們構建的是一個Web應用程式,因為單詞“online”市場會出現在你的工作郵件中。而你的好友則在一家藥店工作,並且喜歡給你發一些他碰巧在工作中遇到的奇聞趣事。同時,和大多數不善於嚴密保護自己郵件地址的人一樣,偶爾你也會收到一封包含單詞”online pharmacy“的垃圾郵件。 也許你已經看出此處的難點--我們往往會告訴分類器”onlie“和”pharmacy“是出現在非垃圾郵件中的,因此這些單詞相對於非垃圾郵件的概率會高一些。當我們告訴分類器有一封包含單詞”onlie pharmacy“ 的郵件屬於垃圾郵件時,則這些單詞的概率又會進行相應的調整,這就導致了一個經常性的矛盾。由於特徵的概率是單獨給出的,因此分類器對於各種組合的情況一無所知。在文件分類中,這通常不是什麼大問題,因為一封包含單詞”online pharmacy“的郵件中可能還會有其他的特徵可以說明它是垃圾郵件,但是在面對其他問題時,理解特徵的組合可能是至關重要的。