⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strong_elim_order.m

📁 麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!
💻 M
字号:
function order = strong_elim_order(G, node_sizes, partial_order)% STRONG_ELIM_ORDER Find an elimination order to produce a strongly triangulated graph.% order = strong_elim_order(moral_graph, node_sizes, partial_order)% % partial_order(i,j)=1 if we must marginalize i *after* j% (so i will be nearer the strong root).% e.g., if j is a decision node and i is its information set:%   we cannot maximize j if we have marginalized out some of i% e.g., if j is a continuous child and i is its discrete parent:%   we want to integrate out the cts nodes before the discrete ones,%   so that the marginal is strong.%% For details, see% - Jensen, Jensen and Dittmer, "From influence diagrams to junction trees", UAI 94.% - Lauritzen, "Propgation of probabilities, means, and variances in mixed graphical%   association models", JASA 87(420):1098--1108, 1992.%% On p369 of the Jensen paper, they state "the reverse of the elimination order must be some% extension of [the partial order] to a total order".% We make no attempt to find the best such total ordering, in the sense of minimizing the weight% of the resulting cliques.% Example from the Jensen paper:% Let us number the nodes in Fig 1 from top to bottom, left to right,% so a=1,b=2,D1=3,c=4,...,l=14,j=15,k=16.% The elimination ordering they propose on p370 is [14 15 16 11 12 1 4 5 10 8 13 9 7 6 3 2];if 0  total_order = topological_sort(partial_order);  order = total_order(end:-1:1); % no attempt to find an optimal constrained ordering!  return;end% The following implementation is due to Ilya Shpitser and seems to give wrong% results on cg1n = length(G);MG = G; % copy the original graphuneliminated = ones(1,n);order = zeros(1,n);for i=1:n  roots = [];  k = 1;  for j=1:n    if sum(partial_order(j,:)) == 0      roots(k) = j;      k = k + 1;    end  end  U = find(uneliminated);  valid = myintersect(U, roots);  % Choose the best node from the set of valid candidates  score1 = zeros(1,length(valid));  score2 = zeros(1,length(valid));  for j=1:length(valid)    k = valid(j);    ns = myintersect(neighbors(G, k), U);    l = length(ns);    M = MG(ns,ns);    score1(j) = l^2 - sum(M(:)); % num. added edges    score2(j) = prod(node_sizes([k ns])); % weight of clique  end  j1s = find(score1==min(score1));  j = j1s(argmin(score2(j1s)));  k = valid(j);  uneliminated(k) = 0;  order(i) = k;  ns = myintersect(neighbors(G, k), U);  if ~isempty(ns)    G(ns,ns) = 1;    G = setdiag(G,0);  end  partial_order(:,k) = 0;end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -