我是靠谱客的博主 朴实苗条,最近开发中收集的这篇文章主要介绍【Matlab】贝叶斯网络工具箱简介,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文主要参考:

贝叶斯网络结构学习之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】贝叶斯网络工具箱简介所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部