Daniel@0: % Evaluate effectiveness of likelihood weighting on the lawn sprinkler example Daniel@0: Daniel@0: N = 4; Daniel@0: dag = zeros(N,N); Daniel@0: C = 1; R = 2; S = 3; W = 4; Daniel@0: dag(C,[R S]) = 1; Daniel@0: dag(R,W) = 1; Daniel@0: dag(S,W)=1; Daniel@0: Daniel@0: false = 1; true = 2; Daniel@0: ns = 2*ones(1,N); % binary nodes Daniel@0: Daniel@0: bnet = mk_bnet(dag, ns); Daniel@0: bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]); Daniel@0: bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]); Daniel@0: bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]); Daniel@0: bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]); Daniel@0: Daniel@0: Daniel@0: clear engine; Daniel@0: engine{1} = jtree_inf_engine(bnet); Daniel@0: engine{2} = likelihood_weighting_inf_engine(bnet); Daniel@0: Daniel@0: nengines = length(engine); Daniel@0: m = cell(1, nengines); Daniel@0: ll = zeros(1, nengines); Daniel@0: Daniel@0: evidence = cell(1,N); Daniel@0: %evidence{C} = true; % evidence at the top is the easiest Daniel@0: evidence{W} = true; % evidence at the bottom is the hardets Daniel@0: Daniel@0: query = [R]; Daniel@0: Daniel@0: i=1; Daniel@0: engine{i} = enter_evidence(engine{i}, evidence); Daniel@0: exact_m = marginal_nodes(engine{i}, query); Daniel@0: Daniel@0: i=2; Daniel@0: samples = 100:100:500; Daniel@0: err = zeros(1, length(samples)); Daniel@0: for j=1:length(samples) Daniel@0: nsamples = samples(j); Daniel@0: engine{i} = enter_evidence(engine{i}, evidence, nsamples); Daniel@0: approx_m = marginal_nodes(engine{i}, query); Daniel@0: a1=approxeq(approx_m.T,exact_m.T,1e-1); Daniel@0: a2=approxeq(approx_m.T,exact_m.T,1e-2); Daniel@0: a3=approxeq(approx_m.T,exact_m.T,1e-3); Daniel@0: e = sum(abs(approx_m.T(:) - exact_m.T(:))); Daniel@0: fprintf('%d samples, 1dp %d, 2dp %d, 3dp %d, err %f\n', nsamples, a1, a2, a3, e); Daniel@0: err(j) = e; Daniel@0: end