贝叶斯网络学习


贝叶斯网络是一种概率网络,它是基于概率推理的图形化网络,而贝叶斯公式则是这个概率网络的基础。贝叶斯网络是基于概率推理的数学模型,所谓概率推理就是通过一些变量的信息来获取其他的概率信息的过程,基于概率推理的贝叶斯网络(Bayesian network)是为了解决不定性和不完整性问题而提出的,它对于解决复杂设备不确定性和关联性引起的故障有很大的优势,在多个领域中获得广泛应用。【来源:百度百科

读综述文章,初步了解贝叶斯网络

读完以下4篇文献,你将对贝叶斯网络有个初步的了解!!!
(1)《贝叶斯网络发展及其应用综述》
【黄影平. 贝叶斯网络发展及其应用综述[J]. 北京理工大学学报, 2013, 33(12):1211-1219.】
(2)《贝叶斯网络研究综述》
【胡春玲. 贝叶斯网络研究综述[J]. 合肥学院学报(综合版), 2013, 23(1):33-40.】
(3)《贝叶斯网络结构学习综述》
【李硕豪, 张军. 贝叶斯网络结构学习综述[J]. 计算机应用研究, 2015(3):641-646.】
(4)《贝叶斯网络推理算法综述》
【厉海涛, 金光, 周经伦,等. 贝叶斯网络推理算法综述[J]. 系统工程与电子技术, 2008, 30(5):935-939.】

实例出发,了解贝叶斯网络在做什么

以下为一段贝叶斯网络训练的matlab代码,包括结构学习和参数学习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
% ********************************************************************* %
% ************************ 贝叶斯网络实例 ***************************** %
% ********************************************************************* %
%
clear
clc
% *********************************************************************** %
% ……………………………………… 已知网络 ……………………………………………… %
% *********************************************************************** %
N = 5; % 4个节点
dag = zeros(N,N); % dag为网络结构边的关系
E = 1; B = 2; R = 3; A = 4; C = 5; % 节点编号
dag(E,[R A]) = 1; % 节点加边
dag(B,A) = 1; % 节点加边
dag(A,C)=1; % 节点加边
false = 1; true = 2;
ns = 2*ones(1,N); % 节点可能的取值个数(这里为2个,取值为:0或1)
bnet = mk_bnet(dag, ns); % 生成bnet,包括结构和参数(概率)
bnet.CPD{E} = tabular_CPD(bnet, E, [0.1 0.9]);% 给各个节点添加先验概率
bnet.CPD{B} = tabular_CPD(bnet, B, [0.01 0.99]);
bnet.CPD{R} = tabular_CPD(bnet, R, [0.65 0.01 0.35 0.99]);
bnet.CPD{A} = tabular_CPD(bnet, A, [0.95 0.8 0.3 0.001 0.05 0.2 0.7 0.999]);
bnet.CPD{C} = tabular_CPD(bnet, C, [0.7 0.05 0.3 0.95]);
% *********************************************************************** %
% ……………………………………… 生成数据 ……………………………………………… %
% *********************************************************************** %
seed = 0; %seed表示采用v4版本的随机数产生器,state是v5版本的随机数产生器
rand('state', seed); % 使用state指定状态,这样产生的随机结果相同,
randn('state', seed); % 也就是说:你我生成的随机数相同,不论时间和地点
ncases = 1000;
data = zeros(N, ncases);
for m=1:ncases
data(:,m) = cell2num(sample_bnet(bnet)); % 根据以上生成的bnet生成随机样本
end
% *********************************************************************** %
% ………………………………………1.结构学习……………………………………………… %
% *********************************************************************** %
order = [2,1,4,5,3]; % 定义节点序,节点序属于先验知识
max_fan_in = 2; % 定义最大父节点个数,不超过总节点个数N
% 结构学习(采用K2算法进行结构训练)
dag2 = learn_struct_K2(data, ns, order, 'max_fan_in', max_fan_in, 'verbose', 'yes');
% [dags,~,~] = learn_struct_mcmc(data, ns);
% Sum_dag = zeros(N,N);
% for i=1:size(dags,2)
% Sum_dag = Sum_dag+dags{1,i};
% end
% dag2 = triu(Sum_dag);
% for i=1:N
% for j=1:N
% if dag2(i,j)>300
% dag2(i,j) = 1;
% else
% dag2(i,j) = 0;
% end
% end
% end
% *********************************************************************** %
% ………………………………………2.参数学习……………………………………………… %
% *********************************************************************** %
bnet2 = mk_bnet(dag2, ns);
seed = 0;
rand('state', seed);
bnet2.CPD{E} = tabular_CPD(bnet2, E, 'clamped', 1, 'CPT', [0.1 0.9], 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{B} = tabular_CPD(bnet2, B, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{R} = tabular_CPD(bnet2, R, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{A} = tabular_CPD(bnet2, A, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
bnet2.CPD{C} = tabular_CPD(bnet2, C, 'prior_type', 'dirichlet', 'dirichlet_weight', 0);
% 从完全观测数据找最大似然估计(maximumlikelihood estimator,MLE)
bnet3 = learn_params(bnet2, data);
% *********************************************************************** %
% ……………………………………………3.推理……………………………………………… %
% *********************************************************************** %
engine = jtree_inf_engine(bnet3); % 联合树推理引擎
ev = cell(1,N); % 添加证据
ev{C} = 1; % 节点C出现
ev{R} = 1; % 节点R出现
engine = enter_evidence(engine, ev); % 向网络添加指定的证据
mE = marginal_nodes(engine, E); % 计算节点E的边缘概率
mB = marginal_nodes(engine, B); % 计算节点B的边缘概率
% *********************************************************************** %
% …………………………………………… 结果显示 ………………………………………… %
% *********************************************************************** %
% (1)显示结构学习效果
h1 = view(biograph( dag )); % 画出已知网络结构图
h2 = view(biograph( dag2 )); % 画出学习网络结构图
% (2)显示参数学习效果
CPT3 = cell(1,N);
for i=1:N
s=struct(bnet.CPD{i});
CPT{i}=s.CPT;
s1=struct(bnet3.CPD{i});
CPT3{i}=s1.CPT;
end
AA = [CPT{1,4}(:,:,1) CPT{1,4}(:,:,2)]; % 取了其中一个节点比较(节点A)
BB = [CPT3{1,4}(:,:,1) CPT3{1,4}(:,:,2)];
data = [[AA(1,:),AA(2,:)]' [BB(1,:),BB(2,:)]'];
colnames = {'原始概率' '学习概率'};
figure;
uitable('position',[0 80 200 200],'data',data,'ColumnName',colnames)
% (3)显示推理结果
msgbox(['P(E|C,R)=',num2str(mE.T(1)),';P(B|C,R)=',num2str(mB.T(1)),' www.ttin.top'])

以上段代码解释如下:

首先:构建网络、生成数据。

是窃贼还是地震?
福尔摩斯先生在他的办公室工作时接到了他邻居华生的电话。华生告诉他:他的家里可能进了窃贼,因为他家的警铃响了。
被告知有窃贼闯入,福尔摩斯迅速开车回家。在路上,他听广播得知他家那里发生了地震。地震也有可能引起警报。这样,请问福尔摩斯先生应该回家抓贼还是迅速撤离该地区以躲避地震?

该贝叶斯网络为“是窃贼还是地震”模型,其中节点E表示地震(Earthquake), 节点B表示盗窃(Burglary), 节点R表示广播(Radio), 节点A表示警铃(Alarm), 节点C表示打电话(Call)
其实就是我们对已知网络进行手动构建,一是为网络添加包括节点、边和方向的网络结构,二是为网络添加包括参数,即条件概率表(包括节点出现的先验概率和条件概率)。
采用贝叶斯工具箱(BNT)中的sample_bnet函数对已知贝叶斯网络bnet进行随机采样,生成实验数据。

其次:结构学习

采用K2算法对实验数据进行结构学习,贝叶斯工具箱(BNT)中的K2结构学习函数需要输入数据(data), 节点可能的取值个数(ns), 节点序(order)和最大父节点个数(max_fan_in)。从下图可以看出,经过结构学习后的结构和已知结构完全相同(该结构比较简单,且我们已知了节点序order(专家知识),所以拟合的比较好,但针对复杂结构可能就没那么好的效果了),说明该结构学习算法对数据拟合的比较好。

然后:参数学习

采用最大似然估计算法对实验数据进行参数学习,先用第三部分结构学习后的网络结构生成一个bnet结构(bnet2 = mk_bnet(dag2, ns);),然后初始化bnet2的CPD,最后采用BNT工具箱中的参数学习行数对数据进行参数学习(bnet3 = learn_params(bnet2, data);)。学习结果如下表所示,从表中可以看,学习后的概率与预设概率接近。

最后:推理

采用贝叶斯工具箱(BNT)中的联合树推理引擎,先是用jtree_inf_engine函数生成联合树推理引擎,然后用enter_evidence函数向网络添加证据(证据需放入cell中,放在矩阵中会出错,这是enter_evidence函数的输入格式要求),最后用marginal_nodes函数计算对应节点的边缘概率。
计算出节点E和节点B的边缘概率mE.T(1),即P(E|C,R)和mB.T(1),即P(B|C,R)(虽然计算出来的是边缘概率P(E)和P(B),但是在提供证据C,R出现的情况下推算出来的,所以也可看作后验概率P(E|C,R)和P(B|C,R)),并由P(E|C,R)和P(B|C,R)判断是地震还是窃贼。

如图所示,推理结果为:P(E|C,R)=0.96081、P(B|C,R)=0.0033339,即在接到邻居华生的电话和听到广播得知他家那里发生了地震的情况下,他家发生地震的概率更大,福尔摩斯先生应迅速撤离该地区以躲避地震而不是回家抓贼。

© 2018 TinTin All Rights Reserved. 本站访客数人次 本站总访问量
主题: hiero