采用matlab的贝叶斯工具箱BNT完成以下“过劳死”问题的建模。
使用BNT工具箱中的贝叶斯结构、参数学习命令。
(t=ture; f=false)
参数学习代码:
%高级人工智能%
%BNT的参数学习%
N=5; %四个节点分别是国家政策C,学校政策U,工作压力大W,身体状况差B,过劳死D
dag=zeros(N,N); %网络连接矩阵初始化
C=1;U=2;W=3;B=4;D=5; %初始化节点顺序
dag(C,U)=1; %定义节点之间的连接关系
dag(U,[W B])=1;
dag(W,D)=1;
dag(B,D)=1;
discrete_nodes=1:N; %离散节点
node_sizes=2*ones(1,N); %节点状态数
%建立网络架构
bnet=mk_bnet(dag,node_sizes,'names',{'国家政策(C)','学校政策(U)','工作压力大(W)','身体状况差(B)','过劳死(D)'},'discrete',discrete_nodes);
%手工构造条件概率CPT表
bnet.CPD{C} = tabular_CPD(bnet,C,[0.5 0.5]);
bnet.CPD{U} = tabular_CPD(bnet,U,[0.95 0.01 0.05 0.99]);
bnet.CPD{W} = tabular_CPD(bnet,W,[0.9 0.05 0.1 0.95]);
bnet.CPD{B} = tabular_CPD(bnet,B,[0.3 0.01 0.7 0.99]);
bnet.CPD{D} = tabular_CPD(bnet,D,[0.335 0.3 0.05 0 0.665 0.7 0.95 1]);
%画出建立好的贝叶斯网络
figure
draw_graph(dag)
%手动构造样本数据samples:
nsamples=20000;
samples=cell(N,nsamples);
for i=1:nsamples
samples(:,i)=sample_bnet(bnet);
end
data=cell2num(samples);
bnet2 = mk_bnet(dag,node_sizes,'discrete',discrete_nodes);
%手动构造条件概率表cpt
seed=0;
rand('state',seed);
bnet2.CPD{C}=tabular_CPD(bnet2,C);
bnet2.CPD{U}=tabular_CPD(bnet2,U);
bnet2.CPD{W}=tabular_CPD(bnet2,W);
bnet2.CPD{B}=tabular_CPD(bnet2,B);
bnet2.CPD{D}=tabular_CPD(bnet2,D);
%手动构造得到的样本作为训练集代入learn_params()函数进行学习
bnet3=learn_params(bnet2,data);
%查看学习后的参数
CPT3=cell(1,N);
for i=1:N
s=struct(bnet3.CPD{i});
CPT3{i}=s.CPT;
end
fprintf('输出学习后的过劳死节点参数:\n');
dispcpt(CPT3{5});
%查看原来节点参数后的参数
CPT=cell(1,N);
for i=1:N
s=struct(bnet.CPD{i});
CPT{i}=s.CPT;
end
fprintf('输出真实的过劳死节点参数:\n');
dispcpt(CPT{5});
运行结果:
ans =
0.4500 0.5500 0.2833 0.6167 0.5500
输出学习后的过劳死节点参数:
1 1 : 0.3233 0.6767
2 1 : 0.2458 0.7542
1 2 : 0.0488 0.9512
2 2 : 0.0000 1.0000
输出真实的过劳死节点参数:
1 1 : 0.3350 0.6650
2 1 : 0.3000 0.7000
1 2 : 0.0500 0.9500
2 2 : 0.0000 1.0000
结构学习代码:
N=5;%四个节点分别是国家政策C,学校政策U,工作压力大W,身体状况差B,过劳死D
dag=zeros(N,N);%网络连接矩阵初始化
C=1;U=2;W=3;B=4;D=5;%初始化节点顺序
dag(C,U)=1;%定义节点之间的连接关系
dag(U,[W B])=1;
dag(W,D)=1;
dag(B,D)=1;
discrete_nodes=1:N;%离散节点
node_sizes=2*ones(1,N);%节点状态数
%建立网络架构
bnet=mk_bnet(dag,node_sizes,'names',{'国家政策(C)','学校政策(U)','工作压力大(W)','身体状况差(B)','过劳死(D)'},'discrete',discrete_nodes);
%手工构造条件概率CPT表
bnet.CPD{C} = tabular_CPD(bnet,C,[0.5 0.5]);
bnet.CPD{U} = tabular_CPD(bnet,U,[0.95 0.01 0.05 0.99]);
bnet.CPD{W} = tabular_CPD(bnet,W,[0.9 0.05 0.1 0.95]);
bnet.CPD{B} = tabular_CPD(bnet,B,[0.3 0.01 0.7 0.99]);
bnet.CPD{D} = tabular_CPD(bnet,D,[0.335 0.3 0.05 0 0.665 0.7 0.95 1]);
%画出建立好的贝叶斯网络
% figure
% draw_graph(dag)
%手动构造样本数据samples:
nsamples=2000;
samples=cell(N,nsamples);
for i=1:nsamples
samples(:,i)=sample_bnet(bnet);
end
data=cell2num(samples);
%结构学习
order=[1 2 3 4 5]; % 节点次序
ns=[2 2 2 2 2]; % 节点属性值的个数
max_fan_in=2; % 最大父节点数目
dag2 = learn_struct_K2(data,ns,order,'max_fan_in',max_fan_in);
bnet2=mk_bnet(dag2,node_sizes,'names',{'国家政策(C)','学校政策(U)','工作压力大(W)','身体状况差(B)','过劳死(D)'},'discrete',discrete_nodes);
%手工构造条件概率CPT表
bnet2.CPD{C} = tabular_CPD(bnet2,C,[0.5 0.5]);
bnet2.CPD{U} = tabular_CPD(bnet2,U,[0.95 0.01 0.05 0.99]);
bnet2.CPD{W} = tabular_CPD(bnet2,W,[0.9 0.05 0.1 0.95]);
bnet2.CPD{B} = tabular_CPD(bnet2,B,[0.3 0.01 0.7 0.99]);
bnet2.CPD{D} = tabular_CPD(bnet2,D,[0.335 0.3 0.05 0 0.665 0.7 0.95 1]);
figure
draw_graph(dag); %画出建立好的贝叶斯网络
CPT2=cell(1,N);
for i=1:N
s=struct(bnet2.CPD{i});
CPT2{i}=s.CPT;
end
fprintf('输出结构学习之后过劳死节点参数:\n');
dispcpt(CPT2{5});
运行结果:
输出结构学习之后过劳死节点参数:
1 1 : 0.3350 0.6650
2 1 : 0.3000 0.7000
1 2 : 0.0500 0.9500
2 2 : 0.0000 1.0000