程式扎記: [ML in DH] Classification 之 Naive Bayesian Categorization

標籤

2014年5月29日 星期四

[ML in DH] Classification 之 Naive Bayesian Categorization

內容來自課程 這裡 
Preface: 
假設現在有一篇文件,其 representation 為一 n 個維度的特徵向量 X = (x1, x2, ..., xn). 目標是將其分類於 m 個 classes C1, ..., Cm之一。直覺的作法是對於每個 class ,估算 P(Ci|X). 如果P(Ci|X) 比其他 P(Cj|X) 有著更高的機率,the naive Bayesian classifier 會將文件 X 分類於 Ci : 
 

Naive Bayesian Training: 
如何利用 training documents 估算 P(X|Ci) 與 P(Ci)? 將 P(Ci) 以「訓練文件中,屬於 class Ci 的比例」估算. 也就是說,若 T(Ci) 表示被分類於 Ci 的訓練文件,我們用 P(Ci) = si/S其中 S=|T|, si=|T(Ci)|)來估算 P(Ci) 。為了簡化 P(X|Ci) 的估算,我們天真地 (naively假設特徵維度之間滿足條件獨立。也就是說: 
 

令 T(Ci, xj) 為 T(Ci) 中,文件含有特徵 xj 的集合。我們用 T(Ci, xj) 在 T(Ci) 所佔的比例估算 P(xj|Ci)。– 也就是說, P(xj|Ci)=sij/si, 其中 sij=|T(Ci, xj)|. 

Example: Naive Bayesian Categorization 
現有一筆關於某人的資料,欲「推測」其是否會買電腦? 
 

方法:令 C1 代表「YES:會買電腦」, C2 代表「NO:不會買電腦」。現比較 P(C1|X) 與 P(C2|X),取最大者之類別: 
 
 

Toolkit Usage: 
根據上面說明, 我實作 Naive Bayesian 在 "NaiveBayes.groovy", 有關使用可以參考下面範例: 
  1. def labels = ["Age""Income""Student?""CC""Class"]  
  2. def datas =  [["<=30""高""N""O""N"],  
  3.               ["<=30""高""N""G""N"],  
  4.               ["31-40""高""N""O""Y"],  
  5.               [">40""中""N""O""Y"],  
  6.               [">40""低""Y""O""Y"],  
  7.               [">40""低""Y""G""N"],  
  8.               ["31-40""低""Y""G""Y"],  
  9.               ["<=30""中""N""O""N"],  
  10.               ["<=30""低""Y""O""Y"],  
  11.               [">40""中""Y""O""Y"],  
  12.               ["<=30""中""Y""G""Y"],  
  13.               ["31-40""中""N""G""Y"],  
  14.               ["31-40""高""Y""O""Y"],  
  15.               [">40""中""N""G""N"]]  
  16. NaiveBayes nb = new NaiveBayes()  
  17.   
  18. // 收集每個 Instance 的 Category  
  19. def cateList = datas.collect {it[4]}  
  20. def instances = []  
  21. datas.each { data->  
  22.     //printf "\t[Test] %s\n", data[0..3].join(",")  
  23.     instances.add(data[0..3])  
  24. }  
  25. printf "\t[Info] NaiveBayes training...%s\n", nb.train2(instances, cateList)  
  26. def testInst = ["<=30""中""Y""O"]  
  27. printf "\t[Info] Instance=[%s] is classified as %s!\n", testInst.join(","), nb.classify2(testInst)  
  28. testInst = ["31-40""高""N""O"]  
  29. printf "\t[Info] Instance=[%s] is classified as %s!\n", testInst.join(","), nb.classify2(testInst)  
執行結果: 
 

Supplement: 
[ ML In Action ] Classifying with probability theory : naive Bayes

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!