Matlab贝叶斯工具箱BNT建模

采用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 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值