下面首先介紹一個結構學習方法,接着利用Matlab中的貝葉斯網絡工具箱的K2算法學習該貝葉斯網絡的結構。有關貝葉斯網絡工具箱的使用,請看【Matlab】貝葉斯網絡工具箱簡介。
問題:服務器數據傳送
現有兩臺服務器(S1和S2),都會單向向用戶U傳送數據,服務器S1和S2之間也會有數據通訊,但無法確定他們之間的數據流向。數據包的傳送只取兩種可能值:T=1(成功)或者F=2(失敗)。
現有數據如下:
1 2 1
2 2 2
2 1 1
2 1 1
2 1 1
2 1 1
2 2 2
2 1 1
2 1 1
1 2 1
2 1 1
2 1 1
2 1 1
1 2 1
2 2 2
1 2 1
2 2 2
1 2 1
2 2 2
2 1 1
2 1 1
2 1 1
2 1 1
2 1 1
2 2 2
1 1 2
2 2 2
2 1 1
2 1 1
2 1 1
2 1 1
1 2 1
2 1 1
1 2 1
2 1 1
1 2 1
1 2 1
2 1 1
2 1 1
1 2 1
1 2 1
2 2 2
2 1 1
2 2 2
2 1 1
2 1 1
2 1 1
1 2 1
2 1 1
2 2 2
2 1 1
1 2 1
2 1 1
2 1 1
2 1 1
2 2 2
2 1 1
2 2 2
1 2 1
2 1 1
2 2 2
1 1 2
2 1 1
1 2 1
2 1 1
2 2 2
2 1 1
2 2 2
2 1 1
1 1 2
1 2 1
2 2 2
2 1 1
2 1 1
1 2 1
1 2 1
2 1 1
2 1 1
2 1 1
2 1 1
1 2 1
2 2 2
1 1 2
2 1 1
2 1 1
1 2 1
1 1 2
2 1 1
2 1 1
2 1 1
1 2 1
1 2 1
1 2 1
2 1 1
2 2 2
2 1 1
2 1 1
2 1 1
2 1 1
2 1 1
需要根據上述的數據,學習貝葉斯網絡的結構,Matlab代表如下所示。
function [] = h2()
%% 讀取數據
data = load('server_data.txt')';
N = size(data,1);%節點的個數
%% 分別採用了兩種評分函數(貝葉斯評分、BIC評分)根據數據集使用K2算法學習網絡結構,並比較網絡結構與真實結構的差異。
order = 1:N;
max_fan_in = 2;%每個節點允許的最大父節點數量
ns = 2*ones(1,N); %每個節點都只有兩個取值,即一個父節點最多有兩個子節點
dag1 = learn_struct_K2(data, ns, order, 'max_fan_in', max_fan_in)
%dag2 = learn_struct_K2(data, ns, order, 'max_fan_in', max_fan_in, 'scoring_fn', 'bic', 'params', [])
meanings = {'s1','s2','user'};%數據含義
graph(dag1,meanings);%繪出貝葉斯網絡的圖像
end
%% 繪圖
function graph(cm,meanings)
%% 去除圖中的權重爲inf的邊
for i=1:size(cm,1)
for j=1:size(cm,2)
if cm(i,j) == inf
cm(i,j) = 0;
end
end
end
%% 設置圖顯示權重並可視化
bg=biograph(cm,meanings);
bg.showWeights='on';
view(bg);
end
學習到的結構如下所示。