一个草地湿润模型,Cloudy表示天气是否多云,C=1(F)表示False,C=2(T)表示True,一下表示均相同,Sprinklet表示洒水车是否出动,Rain表示是否下雨,WetGrass表示草地是否是湿的。旁边的表格表示各种条件概率。
贝叶斯网络表示:BNT中使用矩阵方式表示贝叶斯网络,即若节点i到j有一条弧,则对应矩阵中(i,j)值为1,否则为0。上图是一个草地潮湿原因模型。我们使用matlab画出建立好的贝叶斯网络,可以求出单个节点后验概率和多个节点后验概率。
clear
warning('off')
tic;
%1、建立贝叶斯网络结构
N = 4; % 四个节点,分别是C,S,R,W
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;
figure %输出贝叶斯网络
draw_graph(dag);
false = 1; true = 2;
ns = 2*ones(1,N); % binary nodes 节点状态数
bnet = mk_bnet(dag, ns);
% 利用tabular_CPD设置各个变量的边缘概率
% 入度为0,定义顺序是F- T
% 入度为1,顺序是FF- FT- TF- TT
% 入度为2,顺序是FFF- FFT- FTF- FTT- TFF- TFT- TTF- TTT
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]); % 手动输入的条件概率
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]);
% bnet.CPD{W}
CPT = cell(1,N);
for i=1:N
s=struct(bnet.CPD{i}); % violate object privacy STRUCT创建或转换为结构数组
CPT{i}=s.CPT;
end
% Generate training data 构造样本数据 % samples中包括所有节点的观测数据(不包含缺失数据)
nsamples =5000;
% nsamples =3000;
% nsamples =5000;
samples = cell(N, nsamples); %创建单元格数组
for i=1:nsamples
samples(:,i) = sample_bnet(bnet); % 从贝叶斯网络随机生成一个样本
end
% data = cell2num(samples); % 将二维单元格数组转换为二维数值数组
% Make a tabula rasa
% 保证每次运行结果都一样
bnet2 = mk_bnet(dag, ns); %MK_BNET建立贝叶斯网络
seed = 0;
% rand('state', seed); %手动构造条件概率表cpt
bnet2.CPD{C} = tabular_CPD(bnet2, C, 'clamped', 1, 'CPT', [0.5 0.5], ...
'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{R} = tabular_CPD(bnet2, R, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{S} = tabular_CPD(bnet2, S, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{W} = tabular_CPD(bnet2, W, 'prior_type', 'dirichlet', 'dirichlet_weight', 0); % tabular_CPD生成多项式条件概率
%显示估计的参数
Parameter_MLE=bnet2;
CPT_MLE=cell(1,N);
for i=1:N
s=struct(Parameter_MLE.CPD{i});
CPT_MLE{i}=s.CPT;
end
Parameter_MLE_W = CPT_MLE{4};
% Find MLEs from fully observed data
% 找到一个完全观察模型的最大似然参数 极大似然估计
bnet4 = learn_params(bnet2, samples);
% Bayesian updating with 0 prior is equivalent to ML estimation
% 对完全观测数据进行贝叶斯参数更新(没有先验时等价于极大似然估计)
bnet5 = bayes_update_params(bnet2, samples);
CPT4 = cell(1,N);
for i=1:N
s=struct(bnet4.CPD{i}); % violate object privacy
CPT4{i}=s.CPT ;
end
CPT4{4}
CPT5 = cell(1,N);
for i=1:N
s=struct(bnet5.CPD{i}); % violate object privacy
CPT5{i}=s.CPT ;
assert(approxeq(CPT5{i}, CPT4{i}));
end
CPT5{4}
CPT{4}
toc;
在本次实验中,分别用MLE与Bayesian两种算法在1000、3000、5000的数据集上训练学习草地湿润模型,得出模型估计的条件概率。
实验表明,MLE与Bayesian两种算法学习出来的条件概率基本一致,并且随之数据集量的增大,模型训练出来的条件概率更接近真实值,也就是说,可以通过提高数据集的数据量大小来增强模型的精确度。