MatLab BayesNetToolbox参数学习

MatLab BayesNetToolbox参数学习,matlab,nan,bayesian-networks,dirichlet,Matlab,Nan,Bayesian Networks,Dirichlet,我的问题是针对MatLab中的“learn_params()”函数的。在用户手册中,“learn_params()”仅在完全遵守输入数据的情况下才适用。我用一个部分观察到的数据集进行了尝试,其中我将未观察到的值表示为NaN “learn_params()”似乎可以处理数据集中未出现的NAN和节点状态组合。当我应用dirichlet先验平滑0值时,我得到所有节点的“合理”MLE分布。我已经复制了我执行此操作的脚本 有人能澄清我所做的是有意义的还是我错过了 某些东西,例如“learn_params(

我的问题是针对MatLab中的“learn_params()”函数的。在用户手册中,“learn_params()”仅在完全遵守输入数据的情况下才适用。我用一个部分观察到的数据集进行了尝试,其中我将未观察到的值表示为NaN

“learn_params()”似乎可以处理数据集中未出现的NAN和节点状态组合。当我应用dirichlet先验平滑0值时,我得到所有节点的“合理”MLE分布。我已经复制了我执行此操作的脚本

有人能澄清我所做的是有意义的还是我错过了 某些东西,例如“learn_params()”不能部分用于 观测数据

我测试这一点的MatLab脚本如下:

% Incomplete dataset (where NaN's are unobserved)
Age = [1,2,2,NaN,3,3,2,1,NaN,2,1,1,3,NaN,2,2,1,NaN,3,1]; 
TNMStage = [2,4,2,3,NaN,1,NaN,3,1,4,3,NaN,2,4,3,4,1,NaN,2,4];
Treatment = [2,3,3,NaN,2,NaN,4,4,3,3,NaN,2,NaN,NaN,4,2,NaN,3,NaN,4];
Survival = [1,2,1,2,2,1,1,1,1,2,2,1,2,2,1,2,1,2,2,1];
matrixdata = [Age;TNMStage;Treatment;Survival];
node_sizes =[3,4,4,2];

% Enter the variablesmap
keys = {'Age', 'TNM','Treatment', 'Survival'};
v= 1:1:length(keys);
VariablesMap = containers.Map(keys,v);

% create the dag and the bnet
N = length(node_sizes); % Instead of entering it manually
dag2 = zeros(N,N);
dag2(VariablesMap('Treatment'),VariablesMap('Survival')) = 1;
bnet21 = mk_bnet(dag2, node_sizes);
draw_graph(bnet21.dag);
dirichletweight=1;

% define the CPD priors you want to use
bnet23.CPD{VariablesMap('Age')} = tabular_CPD(bnet23, VariablesMap('Age'), 'prior_type', 'dirichlet','dirichlet_type', 'unif', 'dirichlet_weight', dirichletweight);
bnet23.CPD{VariablesMap('TNM')} = tabular_CPD(bnet23, VariablesMap('TNM'), 'prior_type', 'dirichlet','dirichlet_type', 'unif', 'dirichlet_weight', dirichletweight);
bnet23.CPD{VariablesMap('Treatment')} = tabular_CPD(bnet23, VariablesMap('Treatment'), 'prior_type', 'dirichlet','dirichlet_type', 'unif','dirichlet_weight', dirichletweight);
bnet23.CPD{VariablesMap('Survival')} = tabular_CPD(bnet23, VariablesMap('Survival'), 'prior_type', 'dirichlet','dirichlet_type', 'unif','dirichlet_weight', dirichletweight);

% Find MLEs from incomplete data with Dirichlet prior CPDs
bnet24 = learn_params(bnet23, matrixdata);

% Look at the new CPT values after parameter estimation has been carried out
CPT24 = cell(1,N);
for i=1:N
s=struct(bnet24.CPD{i}); % violate object privacy
CPT24{i}=s.CPT;
end

根据我对BNT文档的理解,您需要做一些更改:

  • 缺少的值应表示为空单元格,而不是
    NaN
  • learn_params_em
    函数是唯一支持缺失值的函数

  • 我之前的回答是不正确的,因为我错误地回忆了哪些BNT学习函数支持缺失值。

    根据我对BNT文档的理解,您需要做一些更改:

  • 缺少的值应表示为空单元格,而不是
    NaN
  • learn_params_em
    函数是唯一支持缺失值的函数

  • 我之前的回答不正确,因为我错误地回忆起了哪些BNT学习函数支持缺失值。

    @Kaelin,非常感谢您的回答。我一定会按照你的建议对两者进行比较。你知道bayes_update_params()如何支持缺失值的数学答案吗?它只是忽略它们(如learn_params()所做的)还是用一些东西替换丢失的数据?[是的,我将分析函数。]是的,我在读了更多关于此的内容后同意。当您将缺失值保留为NaN值时,MatLab会在计算不同状态的发生次数以进行最大似然估计时自动忽略这些单元格。这不是一个很有列表式的删除,而是类似的东西。@Kaelin,非常感谢你的回答。我一定会按照你的建议对两者进行比较。你知道bayes_update_params()如何支持缺失值的数学答案吗?它只是忽略它们(如learn_params()所做的)还是用一些东西替换丢失的数据?[是的,我将分析函数。]是的,我在读了更多关于此的内容后同意。当您将缺失值保留为NaN值时,MatLab会在计算不同状态的发生次数以进行最大似然估计时自动忽略这些单元格。这并不是完全的列表删除,而是类似的东西。