Mercurial > hg > camir-aes2014
diff toolboxes/FullBNT-1.0.7/bnt/examples/dynamic/cmp_learning_dbn.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/FullBNT-1.0.7/bnt/examples/dynamic/cmp_learning_dbn.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,89 @@ +function [time, CPD, LL, cases] = cmp_learning_dbn(bnet, engine, T, varargin) +% CMP_LEARNING_DBN Compare a bunch of inference engines by learning a DBN +% function [time, CPD, LL, cases] = cmp_learning_dbn(bnet, engine, exact, T, ncases, max_iter) +% +% engine{i} is the i'th inference engine. +% time(e) = elapsed time for doing inference with engine e +% CPD{e,c} is the learned CPD for eclass c in engine e +% LL{e} is the learning curve for engine e +% cases{i} is the i'th training case +% +% The list below gives optional arguments [default value in brackets]. +% +% exact - specifies which engines do exact inference [ 1:length(engine) ] +% check_ll - 1 means we check that the log-likelihoods are correct [1] +% ncases - num. random training cases [2] +% max_iter - max. num EM iterations [2] + +% set default params +exact = 1:length(engine); +check_ll = 1; +ncases = 2; +max_iter = 2; + +args = varargin; +nargs = length(args); +for i=1:2:nargs + switch args{i}, + case 'exact', exact = args{i+1}; + case 'check_ll', check_ll = args{i+1}; + case 'ncases', ncases = args{i+1}; + case 'max_iter', max_iter = args{i+1}; + otherwise, + error(['unrecognized argument ' args{i}]) + end +end + +E = length(engine); +ss = length(bnet.intra); +onodes = bnet.observed; + +cases = cell(1, ncases); +for i=1:ncases + ev = sample_dbn(bnet, 'length', T); + cases{i} = cell(ss,T); + cases{i}(onodes,:) = ev(onodes, :); +end + +LL = cell(1,E); +time = zeros(1,E); +for i=1:E + tic + [bnet2{i}, LL{i}] = learn_params_dbn_em(engine{i}, cases, 'max_iter', max_iter); + time(i) = toc; + fprintf('engine %d took %6.4f seconds\n', i, time(i)); +end + +ref = exact(1); % reference +cmp = mysetdiff(exact, ref); +if check_ll + for i=cmp(:)' + if ~approxeq(LL{ref}, LL{i}) + error(['engine ' num2str(i) ' has wrong ll']) + end + end +end + +nCPDs = length(bnet.CPD); +CPD = cell(E, nCPDs); +tabular = zeros(1, nCPDs); +for i=1:E + temp = bnet2{i}; + for c=1:nCPDs + tabular(c) = isa(temp.CPD{c}, 'tabular_CPD'); + CPD{i,c} = struct(temp.CPD{c}); + end +end + +for i=cmp(:)' + for c=1:nCPDs + if tabular(c) + assert(approxeq(CPD{i,c}.CPT, CPD{ref,c}.CPT)); + else + assert(approxeq(CPD{i,c}.mean, CPD{ref,c}.mean)); + assert(approxeq(CPD{i,c}.cov, CPD{ref,c}.cov)); + assert(approxeq(CPD{i,c}.weights, CPD{ref,c}.weights)); + end + end +end +