Matlab 动态贝叶斯网络推理问题

大家好~
我近期用matlab动态贝叶斯网络工具箱,从网站上看大家相关资料都比较少,也有对如何使用推理进行提问的,我也研究了以下,现在给大家说一下我的想法(不一定对,欢迎讨论)。
下面为我参考库中代码写的代码,但是在推理部分还是有些地方不是很理解,希望和大家讨论,以下程序可以run,但最后推理部分需求再确认,建立的网络如下所示。

img

%% Begin
intra = zeros(4);% 定义纬度
intra([2,3,4],1) = 1;% 同一时间片内贝叶斯网络DAG图定义
inter = zeros(4);% 定义片间关系
inter(1,1) = 1;% 定义片间存在父子属性的节点
n = 4;% 节点数目
ss=4;
% draw_graph(intra);

Q = 1; % num hidden states
O = 3; % num observable symbols

ns = [3,2,2,2,3,2,2,2];% 定义每个节点包含的属性
dnodes = 1:4;% decrease node %离散节点编号,在此全部都是离散节点
onodes = 2:4;%observed node% 观测节点编号,在此2,3,4为观测节点,1为隐变量
eclass1 = [1 2 3 4];% 定义类别,第一个时间片,单独一类
eclass2 = [5 2 3 4];% 定义第二个类
bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes, 'eclass1', eclass1, 'eclass2', eclass2, ...
          'observed', onodes);
for i=1:8
  bnet.CPD{i} = tabular_CPD(bnet, i);% 生命概率密度表
end

% 下面用于生成数据,后面经过学习之后需要再用bet生成engine
engine = smoother_engine(jtree_2TBN_inf_engine(bnet));% 定义engine
ncases = 10;%number of examples
T=10;
max_iter=2;%iterations for EM
cases = cell(1, ncases);
for i=1:ncases
  ev = sample_dbn(bnet, T);
  cases{i} = cell(ss,T);
  cases{i}(onodes,:) = ev(onodes, :);
end% 生成10个case,用于学习网络参数,放在bnet2中

[bnet2, LLtrace] = learn_params_dbn_em(engine, cases, 'max_iter', 4);% 学习放在bnet2中
engine = smoother_engine(jtree_2TBN_inf_engine(bnet2));% 用bnet2再次生成engine,用于推理

evidence=cell(4,1);% 定义evidence数据
% evidence{1,1}=1;
evidence{2,1}=1;% 定义参数2,为观测值
evidence{3,1}=2;% 定义参数3,为观测值,
evidence{4,1}=1;% 定义参数4,为观测值

engine = enter_evidence(engine, evidence);% 输入evidence,进行推理
m = marginal_nodes(engine, 1, 1);% marginal_nodes(engine, i, t),

关于 marginal_nodes(engine, i, t),这部分不太理解,推理节点1,在时刻1的结果概率,从结果来看,确实给出了节点1的三个数值的概率,如下图,可看到m.T包含三个数值,对应节点1三个状态的概率。不过总感觉还是一个时间片下的推理结果,按照我的理解,推理数据是否应该是两个时间片的数据,用于推理第二个时间片的隐变量节点,即节点5,如果大家有知道和也请告知,大家一起讨论进步,谢谢。

img

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。