% Be sure to set up BNT with these commands: %addpath /net/hc283/yaner/work/bayes/BNT %add_BNT_to_path % The burglary example from Russell and Norvig, section 15.2 % illustrated in figure 15.2. Different sorts of inferences are % discussed in section 15.3 % the DAG dag = zeros(N,N); B = 1; E = 2; A = 3; JC = 4; MC = 5; dag([B,E],A) = 1; dag(A,[JC,MC]) = 1; % the actual belief net node_sizes = 2*ones(1,N); bnet = mk_bnet(dag, node_sizes, 'names', {'B','E','A','JC','MC'}); % the conditional probability tables (CPTs) false = 1; true = 2; % B | P(B) % -------- % F | .999 % T | .001 bnet.CPD{B} = tabular_CPD(bnet, B, [.999, .001]); % E | P(E) % -------- % F | .998 % T | .002 bnet.CPD{E} = tabular_CPD(bnet, E, [.998, .002]); % B E | A | P(A|B,E) % ------------------ % F F | F | .999 % T F | F | .06 % F T | F | .71 % T T | F | .05 % F F | T | .001 % T F | T | .94 % F T | T | .29 % T T | T | .95 bnet.CPD{A} = tabular_CPD(bnet, A, [.999, .06, .71, .05, .001, .94, .29, .95]); % A | JC | P(JC|A) % ---------------- % F | F | .95 % T | F | .10 % F | T | .05 % T | T | .90 bnet.CPD{JC} = tabular_CPD(bnet, JC, [.95, .10, .05, .90]); % A | MC | P(MC|A) % ---------------- % F | F | .99 % T | F | .30 % F | T | .01 % T | T | .70 bnet.CPD{MC} = tabular_CPD(bnet, MC, [.99, .30, .01, .70]); % Inference (using Junction Trees, an exact inference method that % works on any static belief net) engine = jtree_inf_engine(bnet); % Diagnostic inference: P(B|JC) evidence = cell(1,N); evidence{JC} = true; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, B); marg.T(true) % returns P(B|JC), the answer % Causal inference: P(MC|B) evidence = cell(1,N); evidence{B} = true; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, MC); marg.T(true) % returns P(MC|B), the answer % Simple Intercausal inference: P(B|E) evidence = cell(1,N); evidence{E} = true; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, B); marg.T(true) % returns P(B|E) % More interesting intercausal inference: P(B|A) first, then P(B|A,E) evidence = cell(1,N); evidence{A} = true; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, B); marg.T(true) % returns P(B|A) % now the actual intercausal inference evidence{E} = true; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, B); marg.T(true) % returns P(B|A,E) % the probability goes down; the earthquake "explains away" the alarm.