1. 程式人生 > >貝葉斯網路工具箱(FullBNT-1.0.4)使用說明(一).md

貝葉斯網路工具箱(FullBNT-1.0.4)使用說明(一).md

## How to use the Bayes Network Toolbox 定義一個Bayes網路,要確定兩點,網路結構和引數。 教程地址:http://www.cs.ubc.ca/~murphyk/Software/BNT/usage.html#inference #### 1.構造Bayes Net Bayes Net是一個有向非迴圈圖(directed acyclic graph-dag),我們用鄰接矩陣來表示一個dag。 * 對節點標記順序,父節點序號在子節點之前。 * 如果節點的取值是離散的,那麼節點的大小就是總共可以取值的數目 discrete_nodes=1:N; %標註那些節點是離散的,這裡就是1:N的都是離散的 node_sizes=2*ones(1,N); %node_sizes(i) 是節點 i 可以取得值得數目,在這個例子中,每個節點都只有兩個取值 * 構造BN可以用如下命令: bnet=mk_bnet(dag,node_sizes) * 如果可以確定哪個變數(節點)是可以觀察到的,使用下面的程式碼。如果沒有,可以空缺 onodes=[]; bnet=mk_bnet(dag,node_sizes,'discrete',discrete_nodes,onodes); * 可選引數 'names' 一個cell向量,對於每個節點的名字
bnet=mk_bnet(dag,node_sizes,'names',{'A','B','C'},'discrete',1:3); #### 2. 網路拓撲結構學習 在 1. 中,我們假設已知網路的拓撲結構,因此可以直接構造網路。但如果我們不知道網路的拓撲,那麼就需要對拓撲結構進行學習。 * 在網路拓撲結構學習中,有兩個主要的路線 1. 基於約束條件的學習:將網路全連線,然後去掉條件獨立的邊 2. 搜尋打分學習:在可能的DAGs空間中搜索,對每個進行打分 * 但是要注意,可能的DAG非常之多,是隨節點數目指數級增長的。 * 如果節點數比較小(小於等於6個)可以用暴力搜尋,因為6個節點的DAG共有3781503個(7個節點的話就是10^9數量級個)。     dags=mk_all_dags(N);

    score=score_dags(data,ns,dags);     % data(i,m)是節點i在第m個case中的取值 ns(i)是節點i的大小 ###### K2 algorithm 如果我們知道所有節點的順序,那麼就可以獨立的給每個節點選擇它們的父節點 K2是一種貪婪搜尋演算法。一開始每個節點都沒有父節點,然後逐漸新增父節點,每個新新增的都是使得當前分數最大增加的。     dag=learn_struct_K2(data,node_sizes,order)
    其中 order 是節點的順序資訊,父節點要在子節點前 #### 3.Bayes Net的引數 引數用CPD objects(CPD=Conditional Probability Distribution)表示。CPD表示給定父節點時,該節點的概率分佈。當所有節點的取值都是離散的時候,CPD可以用一個table來表示。即為 CPTs (Tabular CPDs)
* Tabular CPDs(扁平化的CPD)成為CPTs CPT是一個多維向量,比如節點A有兩個父節點C,D,那麼A的CPT就是4個維度,第三個維度為A的取值可能,第四個維度是每種取值的概率。 * 工具箱中預設定義:false==1,true==2,在對引數賦值中應該保持一致性。 如果已知CPD,構造CPT的函式是 bnet.CPD{A}=tabular_CPD(bnet,A,[a1,a2,a3,a4...]); #### 4.CPD CPD的定義是:P(X(i)|X(Pa(i))),X(Pa(i))是節點i的父節點,CPD即node i的父節點發生的情況下i發生的概率。 學習CPD 已有12個引數的BN,網路拓撲結構dag 如果我們不指定CPT,那麼演算法會構造隨機引數,每一列CPT會從均勻分佈中提取。 bnet=mk_bnet(dag,node_sizes); seed=0;%為了保證實驗的可重複性 rand('state',seed); for i=1:12 bnet.CPD{i}=tabular_CPD(bnet,i); end bnet2=learn_params(bnet,data);%引數學習完畢 for i=1:12 s=struct(bnet2.CPD{i});%展示引數 CPT3{i}=s.CPT; end dispcpt(CPT3{1})%展示第一個node的引數 #### 5.Inference推理 BNT 有許多不同的Inference "engines"。 比如聯合樹引擎(junction tree engine)。可以通過如下方式使用: engine = jtree_inf_engine(bnet);