题目:贝叶斯网络综合应用
截止到现在,已经讨论了贝叶斯网络结构学习、贝叶斯网络参数学习、贝叶斯网络推理,现在应该可以应用贝叶斯网络建模了。实际中,出发点一般是一个数据集,根据数据集首先学得贝叶斯网络结构(有向无环图DAG),进而学得贝叶斯网络参数(条件概率表CPT),完成贝叶斯网络学习;根据学得的贝叶斯网络,可以完成一些推理。
这里我们采用网络上公开的天气数据集,该数据集很小,里面的数据纯属虚构。天气数据集列举了在何种天气条件下可以进行体育运动,数据集中的样本由五个属性值来表示,通过测量不同天气四个指标得到样本。天气问题的四个指标是:天气趋势(outlook)、温度(temperature)、湿度(humidity)和刮风(windy)。最后一个属性表示样本的类别,即在四个天气指标的前提下得到是否可运动(play)的结论。该数据集仅有14个样本,其中,天气趋势的属性值分别为sunny, overcast, rainy;温度的属性值分别为hot,mild, cool;湿度的属性值分别为high, normal;刮风的属性值分别为true, false;是否可运动的属性值分别为yes和no。(此部分主要摘自《袁梅宇. 数据挖掘与机器学习 : WEKA应用技术与实践[M]. 2版. 清华大学出版社, 2016.》1.5.1节第29页)
天气数据集如下:
sunny,hot,high,FALSE,no
sunny,hot,high,TRUE,no
overcast,hot,high,FALSE,yes
rainy,mild,high,FALSE,yes
rainy,cool,normal,FALSE,yes
rainy,cool,normal,TRUE,no
overcast,cool,normal,TRUE,yes
sunny,mild,high,FALSE,no
sunny,cool,normal,FALSE,yes
rainy,mild,normal,FALSE,yes
sunny,mild,normal,TRUE,yes
overcast,mild,high,TRUE,yes
overcast,hot,normal,FALSE,yes
rainy,mild,high,TRUE,no
为了能够在matlab中处理,我们对属性值作了如下转换:
sunny-->1
overcast-->2
rainy-->3
cool-->1
mild-->2
hot-->3
normal-->1
high-->2
FALSE-->1
TRUE-->2
no-->1
yes-->2
程序如下:
%Bayes Network Application
%Created by jbb0523@20180304pm
clear all;close all;clc;
%% (0)dataset
data=[
1,3,2,1,1;
1,3,2,2,1;
2,3,2,1,2;
3,2,2,1,2;
3,1,1,1,2;
3,1,1,2,1;
2,1,1,2,2;
1,2,2,1,1;
1,1,1,1,2;
3,2,1,1,2;
1,2,1,2,2;
2,2,2,2,2;
2,3,1,1,2;
3,2,2,2,1;
];
data = data';
%% (1)learn Bayes Network struct
dag = learn_struct_mcmc_basic(data);
%% (2)learn Bayes Network parameters
ns = [3,3,2,2,2];
% Make a tabula rasa
bnet = mk_bnet(dag, ns);
seed = 0;
rand('state', seed);
bnet.CPD{1} = tabular_CPD(bnet, 1, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet.CPD{2} = tabular_CPD(bnet, 2, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet.CPD{3} = tabular_CPD(bnet, 3, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet.CPD{4} = tabular_CPD(bnet, 4, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet.CPD{5} = tabular_CPD(bnet, 5, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
% Find MLEs from fully observed data
bnet1 = learn_params(bnet, data);
%% (3)Bayes Network inference
evidence = cell(1,5);
evidence{1} = 1;%sunny
evidence{2} = 2;%mild
evidence{3} = 1;%normal
evidence{4} = 2;%true
engine = jtree_inf_engine(bnet1);
%most probable explanation
mpe = find_mpe(engine, evidence);
disp('mpe:');disp(mpe);
%posterior probability
engine1 = enter_evidence(engine, evidence);
prob = marginal_nodes(engine1, 5);
disp('probability:');disp(prob.T);
注:第24行调用了个人对learn_struct_mcmc进行了二次封装处理所得的learn_struct_mcmc_basic.m,详情参见《贝叶斯网络结构学习之MCMC算法(基于FullBNT-1.0.4的MATLAB实现)》,运行程序时一定要有函数learn_struct_mcmc_basic.m。
运行结果如下:
程序中,我们根据数据集学得了贝叶斯网络结构和参数,然后进行推理:预测当天气晴朗(sunny)、温度温暖(mild)、温度正常(normal)、刮风(true)的天气条件下是否可以运动,MPE输出结果为2(yes),后验概率结果yes概率等于1,no概率等于0,因此二者的结论是相同的,可以运动。