【Matlab】利用貝葉斯網絡工具箱中的K2算法進行結構學習

下面首先介紹一個結構學習方法,接着利用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

學習到的結構如下所示。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章