1

私の質問は、MatLab のBayesNetToolboxの「learn_params()」関数に固有のものです。ユーザーマニュアルでは、「learn_params()」は、入力データが完全に観察されている場合にのみ使用するのに適していると記載されています。観測されていない値を NaN として表した、部分的に観測されたデータセットで試してみました。

「learn_params()」はデータセットにないNaNやノード状態の組み合わせも扱えるようです。ディリクレ事前確率を適用して 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
4

1 に答える 1

1

BNT ドキュメントに関する私の理解によると、いくつかの変更を加える必要があります。

  1. 欠損値は、値ではなく空のセルとして表す必要がありNaNます。
  2. このlearn_params_em関数は、欠損値をサポートする唯一の関数です。

私の以前の回答は正しくありませんでした。BNT 学習関数のどれが欠損値をサポートしていたかを思い出せなかったからです。

于 2012-07-14T00:37:58.050 に答える