貝葉斯網路工具箱(FullBNT-1.0.4)使用說明(一).md
阿新 • • 發佈:2019-02-02
## 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);
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)