【Matlab】貝葉斯網絡工具箱簡介

本文主要參考:

貝葉斯網絡結構學習之K2算法(基於FullBNT-1.0.4的MATLAB實現)

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

貝葉斯網絡結構學習方法簡介 

貝葉斯網絡結構學習若干問題解釋

貝葉斯網絡結構學習(基於BDAGL工具箱的MATLAB實現)

以及自己對該工具箱的一點認識。通過藉助該工具箱中的一個測試函數 k2demo1.m 瞭解整個貝葉斯網絡工具箱的使用。

1.給定一個貝葉斯網絡結構

N = 4;%節點個數,即參數的個數
dag = zeros(N,N);
C = 1; S = 2; R = 3; W = 4;
dag(C,[R S]) = 1;
dag(R,W) = 1;
dag(S,W)=1;

2.給定該貝葉斯網的條件概率表(即參數)

ns = 2*ones(1,N); %每個節點都只有兩個取值,即一個父節點最多有兩個子節點

false = 1; 
true = 2;

bnet = mk_bnet(dag, ns);%構造貝葉斯網絡
%如果我們不指定CPT,那麼算法會構造隨機參數,每一列CPT會從均勻分佈中提取。
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);%已知CPD,構造CPT
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);

3.根據定義的貝葉斯網來生成隨機採樣的數據集

seed = 0;
rand('state', seed);%state 0 指的是以後產生的隨機數都與第一次運行產生的相同,用於保證實驗的可重複性
randn('state', seed);
ncases = 100;%數據的個數爲100個
data = zeros(N, ncases);
for m=1:ncases
  data(:,m) = cell2num(sample_bnet(bnet));%sample_bnet:從生成好的貝葉斯網絡中隨機採樣一個數據
end

4.分別利用兩種評分函數(貝葉斯評分、BIC評分)學習網絡結構

order = [C S R W];
max_fan_in = 2;

 %將數據集前50個每5個分成一小份,
 %第1次使用數據集前5個,第2次使用數據集前10個,第3次使用數據集前15個...
 %每次將學得的網絡結構與真實的網絡結構作對比。
sz = 5:5:50; 
for i=1:length(sz)
  dag2 = learn_struct_K2(data(:,1:sz(i)), ns, order, 'max_fan_in', max_fan_in);%默認使用貝葉斯評分函數
  correct(i) = isequal(dag, dag2);
end
correct

for i=1:length(sz)
  dag3 = learn_struct_K2(data(:,1:sz(i)), ns, order, 'max_fan_in', max_fan_in, 'scoring_fn', 'bic', 'params', []);%使用BIC評分函數
  correct(i) = isequal(dag, dag3);
end
correct

通過結果可以發現,當數據集大於30時即可基本學習到正確的貝葉斯網絡結構。 

correct =
 
      0     0     0     0     0     1     1     1     1     1
 
 correct =
 
      0     0     0     0     0     1     0     1     1     1

5.完整代碼

%% 給定一個貝葉斯網絡結構
N = 4;%節點個數,即參數的個數
dag = zeros(N,N);
C = 1; S = 2; R = 3; W = 4;
%C = 4; S = 2; R = 3; W = 1; %任意順序
dag(C,[R S]) = 1;
dag(R,W) = 1;
dag(S,W)=1;

%% 給定該貝葉斯網的條件概率表(即,參數)
false = 1; 
true = 2;
ns = 2*ones(1,N); %每個節點都只有兩個取值,即一個父節點最多有兩個子節點

bnet = mk_bnet(dag, ns);%構造BN
%如果我們不指定CPT,那麼算法會構造隨機參數,每一列CPT會從均勻分佈中提取。
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);%已知CPD,構造CPT
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);

%% 根據定義的貝葉斯網來生成隨機採樣的數據集
seed = 0;
rand('state', seed);%state 0 指的是以後產生的隨機數都與第一次運行產生的相同,用於保證實驗的可重複性
randn('state', seed);
ncases = 100;%數據的個數爲100個
data = zeros(N, ncases);
for m=1:ncases
  data(:,m) = cell2num(sample_bnet(bnet));%sample_bnet:從BN中隨機採樣一個數據
end

%% 分別採用了兩種評分函數(貝葉斯評分、BIC評分)根據數據集使用K2算法學習網絡結構,並比較網絡結構與真實結構的差異。
order = [C S R W];
max_fan_in = 2;

%dag2 = learn_struct_K2(data, ns, order, 'max_fan_in', max_fan_in, 'verbose', 'yes');

 %將數據集前50個每5個分成一小份,
 %第1次使用數據集前5個,第2次使用數據集前10個,第3次使用數據集前15個...
 %每次將學得的網絡結構與真實的網絡結構作對比。
sz = 5:5:50; 
for i=1:length(sz)
  dag2 = learn_struct_K2(data(:,1:sz(i)), ns, order, 'max_fan_in', max_fan_in);%max_fan_in:每個節點允許的最大父節點數量
  correct(i) = isequal(dag, dag2);
end
correct

for i=1:length(sz)
  dag3 = learn_struct_K2(data(:,1:sz(i)), ns, order, 'max_fan_in', max_fan_in, 'scoring_fn', 'bic', 'params', []);
  correct(i) = isequal(dag, dag3);
end
correct
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章