概述
本文主要参考:
贝叶斯网络结构学习之K2算法(基于FullBNT-1.0.4的MATLAB实现)
贝叶斯网络工具箱(FullBNT-1.0.4)使用说明(一).md
贝叶斯网络结构学习方法简介
贝叶斯网络结构学习若干问题解释
贝叶斯网络结构学习(基于BDAGL工具箱的MATLAB实现)
以及自己对该工具箱的一点认识。通过借助该工具箱中的一个测试函数 k2demo1.m 了解整个贝叶斯网络工具箱的使用。
工具箱的下载地址:MATLAB贝叶斯网络工具箱FullBNT-1.0.7
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
另外,关于如何使用该工具箱进行结构学习,请移步:
【Matlab】贝叶斯网络理论之结构学习理论介绍及其工具箱安装
【Matlab】利用贝叶斯网络工具箱中的K2算法进行结构学习
最后
以上就是朴实苗条为你收集整理的【Matlab】贝叶斯网络工具箱简介的全部内容,希望文章能够帮你解决【Matlab】贝叶斯网络工具箱简介所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复