一、貝葉斯網絡與朴素貝葉斯的區別
朴素貝葉斯的假設前提有兩個第一個為:各特征彼此獨立;第二個為且對被解釋變量的影響一致,不能進行變量篩選。但是很多情況這一假設是無法做到的,比如解決文本分類時,相鄰詞的關系、近義詞的關系等等。彼此不獨立的特征之間的關系沒法通過朴素貝葉斯分類器訓練得到,同時這種不獨立性也給問題的解決方案引入了更多的復雜性[1]。
此時,更具普遍意義的貝葉斯網絡在特征彼此不獨立情況下,可進行建模。但是貝葉斯網絡並不放寬第二個假設,故不能對變量進行篩選,因為視解釋變量的作用一致。
貝葉斯分類方法是一種展現已知數據集屬性分布的方法,其最終計算結果完全依賴於訓練樣本中類別和特征的分布。與SVM等分類方法不同,它只是對事實進行展現。
|
貝葉斯網絡 |
朴素貝葉斯 |
假設前提 |
各變量都是離散型的 各特征有依賴(不確定的因果推理)關系(變量無關) 每一個節點在其直接前驅節點的值制定后,這個節點條件獨立於其所有非直接前驅前輩節點。 P(v|par(v),x1,x2...,xn) = P(v|par(v)) 貝葉斯網絡放寬了每個變量獨立的假設 |
各特征彼此獨立 朴素貝葉斯中對於若干條件概率值不存在的問題,一般通過將所有的概率值加1來解決 且對被解釋變量的影響一致,不能進行變量篩選 |
應用案例 |
在信息不完備的情況下通過可以觀察隨機變量推斷不可觀察的隨機變量[1] 解決文本分類時,相鄰詞的關系、近義詞的關系 |
分類 |
缺點 |
不能對變量進行篩選,因為不能放寬對被解釋變量影響一致的假設 |
彼此不獨立的特征之間建立朴素貝葉斯,反而加大了模型復雜性 |
優點 |
貝葉斯原理和圖論相結合,建立起一種基於概率推理的數學模型,對於解決復雜的不確定性和關聯性問題有很強的優勢
|
簡單,對於給出的待分類項,會選擇條件概率最大的類別,這就是朴素貝葉斯的思想基礎 |
________________________________________________________________________________________________________________
二、貝葉斯網絡概念
貝葉斯網絡基本概念有兩個:引入了一個有向無環圖(Directed Acyclic Graph)和一個條件概率表集合。
DAG。DAG的結點V包括隨機變量(類別和特征),有向連接E(A->B)表示結點A是結點B的parent,且B與A是有依賴關系的(不獨立)。
條件概率表集合。同時引入了一個條件性獨立(conditional independence)概念:即圖中任意結點v在給定v的parent結點的情況下,與圖中其它結點都是獨立的,也就是說P(v|par(v),x1,x2...,xn) = P(v|par(v))。這里par(v)表示v的parent結點集,x1,x2,...,xn表示圖中其它結點。
我們清楚,如果已知所有聯合概率值(joint distribution),那么任何形式的概率問題都可以迎刃而解。而現實是當特征集合過大(>10)時你幾乎無法通過統計得到。而特征集合的大小在"一定程度上"與最終的分類效果是一個正反饋關系。
所以,這個問題的解決就是通過條件獨立的概念來對各條件概率值進行優化。具體可以參見參考文件的bayesian net的tutorial,我這里不再闡述了(來自博客分類算法之朴素貝葉斯(Naive Bayes)和貝葉斯網絡(Bayesian Networks))。
貝葉斯網絡中連線是如何產生的?
本內容來源於CDA DSC,L2-R課程,第11講。
貝葉斯網絡,不再表示因果關系,而是變量之間的相關依賴關系。
X,y之間線代表的就是條件概率,p(y︱x1)︱x2x3x4...=p(y),等於則不連線,
不等於,說明在控制了x2下,兩者不是獨立,而是相關的,則會連線。
________________________________________________________________________________________________________________
三、貝葉斯網絡簡單案例
貝葉斯網絡原理較為簡單,所以在實際應用中較為廣泛。比如垃圾郵件的處理,先對垃圾郵件分詞,一些垃圾詞“培訓”、“打折”...,只需要做每個單詞在每個文檔中出現的頻次就可以用貝葉斯網絡推斷哪一些是垃圾郵件;
也可以用在社會調查中的量表題,
下圖表示特征屬性之間的關聯:

上圖是一個有向無環圖,其中每個節點代表一個隨機變量,而弧則表示兩個隨機變量之間的聯系,表示指向結點影響被指向結點。不過僅有這個圖的話,只能定性給出隨機變量間的關系,如果要定量,還需要一些數據,這些數據就是每個節點對其直接前驅節點的條件概率,而沒有前驅節點的節點則使用先驗概率表示。
例如,通過對訓練數據集的統計,得到下表(R表示賬號真實性,H表示頭像真實性):

縱向表頭表示條件變量,橫向表頭表示隨機變量。上表為真實賬號和非真實賬號的概率,而下表為頭像真實性對於賬號真實性的概率。這兩張表分別為“賬號是否真實”和“頭像是否真實”的條件概率表。有了這些數據,不但能順向推斷,還能通過貝葉斯定理進行逆向推斷。例如,現隨機抽取一個賬戶,已知其頭像為假,求其賬號也為假的概率:
也就是說,在僅知道頭像為假的情況下,有大約35.7%的概率此賬戶也為假。如果覺得閱讀上述推導有困難,請復習概率論中的條件概率、貝葉斯定理及全概率公式。如果給出所有節點的條件概率表,則可以在觀察值不完備的情況下對任意隨機變量進行統計推斷。上述方法就是使用了貝葉斯網絡。
________________________________________________________________________________________________________________
四、貝葉斯網絡實施步驟
[算法雜貨鋪——分類算法之貝葉斯網絡(Bayesian networks)]
1、步驟
構造與訓練貝葉斯網絡分為以下兩步:
1、確定隨機變量間的拓撲關系,形成DAG。這一步通常需要領域專家完成,而想要建立一個好的拓撲結構,通常需要不斷迭代和改進才可以。
2、訓練貝葉斯網絡參數——估計出各節點的條件概率表。這一步也就是要完成條件概率表的構造,如果每個隨機變量的值都是可以直接觀察的,像我們上面的例子,那么這一步的訓練是直觀的,方法類似於朴素貝葉斯分類。但是通常貝葉斯網絡的中存在隱藏變量節點,那么訓練方法就是比較復雜,例如使用梯度下降法。由於這些內容過於晦澀以及牽扯到較深入的數學知識,在此不再贅述,有興趣的朋友可以查閱相關文獻。
2、案例
還是SNS社區中不真實賬號檢測的例子,我們的模型中存在四個隨機變量:賬號真實性R,頭像真實性H,日志密度L,好友密度F。其中H,L,F是可以觀察到的值,而我們最關系的R是無法直接觀察的。這個問題就划歸為通過H,L,F的觀察值對R進行概率推理。推理過程可以如下表示:
1、使用觀察值實例化H,L和F,把隨機值賦給R。
2、計算(如圖1)。其中相應概率值可以查條件概率表。由於上述例子只有一個未知隨機變量,所以不用迭代。
________________________________________________________________________________________________________________
五、TAN樹增強朴素貝葉斯
TAN是貝葉斯網絡的簡化版本。先構造所有變量兩兩之間的連線(如左圖);然后進行剪枝。特點就是,解釋變量是平行的,不對變量進行篩選,看做是一致的。(第五點內容的補充來自於CDA DSC L2-R語言課程第11講內容)
5.1 相對熵
其最大的特點就是:可以做到衡量p-q,q-p的影響,可以度量兩個隨機變量的“距離”、相互之間的影響力。
5.2 TAN貝葉斯網絡結構的學習
貝葉斯網絡先構造所有變量兩兩之間的連線(如左圖);然后進行剪枝。特點就是,解釋變量是平行的,不對變量進行篩選,看做是一致的。
5.3 TAN貝葉斯網絡的特點
1、全考慮。在未知關系之前,TAN會建立所有輸入變量X與輸出變量Y之間的全聯系,考慮了所有因素對輸出變量Y的影響;
2、X之間非獨立。輸入變量X之間也會存在弧線,意味着變量之間並非全部條件獨立,允許具有相互依賴的關系,突破了朴素貝葉斯的假設;
3、調節效應。輸入變量X之間的有向弧線,代表對Y的調節效應,X1對Y的作用,不僅僅是X1,還可能有X1X2之間對Y的作用。
________________________________________________________________________________________________________________
六、R語言-貝葉斯網絡/朴素貝葉斯
朴素貝葉斯分類對於缺失值並不敏感。R語言中的e1071包中就有可以實施朴素貝葉斯分類的函數,但在本例我們使用klaR包中的NaiveBayes函數,因為該函數較之前者增加了兩個功能,一個是可以輸入先驗概率,另一個是在正態分布基礎上增加了核平滑密度函數[4]。
R語言中可以使用bnlearn包來對貝葉斯網絡進行建模。但要注意的是,bnlearn包不能處理混合數據,所以先將連續數據進行離散化(因子型),再進行建模訓練。
1、bnlearn包介紹
網上有一個bnlearn包的教程,但是有點亂,筆者看了之后就是一頭霧水。所以整理了一下:
該包包含貝葉斯網絡的結構學習、參數學習和推理三個方面的功能,其中結構學習包含基於約束的算法、 基於得分的算法和混合算法, 參數學習包括最大似然估計和貝葉斯估計兩種方法。
此外還有自助法(bootstrap),交叉驗證(cross-validation)和隨機模擬(stochastic simulation)等功能,附加的繪圖功能需要調用前述的 Rgraphviz and lattice 包。
2、R語言實現案例
博客《朴素貝葉斯分類與貝葉斯網絡》有一個案例:數據准備環節
- # 加載擴展包和數據
- library(caret)
- data(PimaIndiansDiabetes2,package='mlbench')
- # 對缺失值使用裝袋方法進行插補
- preproc <- preProcess(PimaIndiansDiabetes2[-9],method="bagImpute")
- data <- predict(preproc,PimaIndiansDiabetes2[-9])
- data$Class <- PimaIndiansDiabetes2[,9]
貝葉斯網絡建模
- # 加載包
- library(bnlearn)
- # 數據離散化
- data2 <- discretize(data[-9],method='quantile')
- data2$class <- data[,9]
- # 使用爬山算法進行結構學習
- bayesnet <- hc(data2)
- # 顯示網絡圖
- plot(bayesnet)
- # 修改網絡圖中的箭頭指向
- bayesnet<- set.arc(bayesnet,'age','pregnant')
- # 參數學習
- fitted <- bn.fit(bayesnet, data2,method='mle')
- # 訓練樣本預測並提取混淆矩陣
- pre <- predict(fitted,data=data2,node='class')
- confusionMatrix(pre,data2$class)
- # 進行條件推理
- cpquery(fitted,(class=='pos'),(age=='(36,81]'&mass=='(34.8,67.1]'))
還有一個可以實現的包——pcalg包,來自博客R語言做貝葉斯網絡結構學習
該博客主要介紹拓撲結構的構建,貼一個案例:
- suffStat <-list(C = cor(iris[,1:4]), n = nrow(iris))
- pc.fit <- pc(suffStat, indepTest = gaussCItest,
- alpha = 0.01,labels =names(iris[1:4]),verbose = TRUE)
- pc.fit
- plot(pc.fit)
________________________________________________________________________________________________________________
參考文獻:
[1]算法雜貨鋪——分類算法之貝葉斯網絡(Bayesian networks)
[3]算法雜貨鋪——分類算法之朴素貝葉斯分類(Naive Bayesian classification)
[4]朴素貝葉斯分類與貝葉斯網絡:http://www.r-bloggers.com/lang/chinese/1065
轉自:http://blog.csdn.net/sinat_26917383/article/details/51569573