Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/bnt/CPDs/@tabular_CPD/bayes_update_params.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function CPD = bayes_update_params(CPD, self_ev, pev) | |
2 % UPDATE_PARAMS_COMPLETE Bayesian parameter updating given completely observed data (tabular) | |
3 % CPD = update_params_complete(CPD, self_ev, pev) | |
4 % | |
5 % self_ev(m) is the evidence on this node in case m. | |
6 % pev(i,m) is the evidence on the i'th parent in case m (if there are any parents). | |
7 % These can be arrays or cell arrays. | |
8 % | |
9 % We update the Dirichlet pseudo counts and set the CPT to the mean of the posterior. | |
10 | |
11 if iscell(self_ev), usecell = 1; else usecell = 0; end | |
12 | |
13 ncases = length(self_ev); | |
14 sz = CPD.sizes; | |
15 nparents = length(sz)-1; | |
16 assert(nparents == size(pev,1)); | |
17 | |
18 if ncases == 0 | ~adjustable_CPD(CPD) | |
19 return; | |
20 elseif ncases == 1 % speedup the sequential learning case by avoiding normalization of the whole array | |
21 if usecell | |
22 x = cat(1, pev{:})'; | |
23 y = self_ev{1}; | |
24 else | |
25 x = pev(:)'; | |
26 y = self_ev; | |
27 end | |
28 switch nparents | |
29 case 0, | |
30 CPD.dirichlet(y) = CPD.dirichlet(y)+1; | |
31 CPD.CPT = CPD.dirichlet / sum(CPD.dirichlet); | |
32 case 1, | |
33 CPD.dirichlet(x(1), y) = CPD.dirichlet(x(1), y)+1; | |
34 CPD.CPT(x(1), :) = CPD.dirichlet(x(1), :) ./ sum(CPD.dirichlet(x(1), :)); | |
35 case 2, | |
36 CPD.dirichlet(x(1), x(2), y) = CPD.dirichlet(x(1), x(2), y)+1; | |
37 CPD.CPT(x(1), x(2), :) = CPD.dirichlet(x(1), x(2), :) ./ sum(CPD.dirichlet(x(1), x(2), :)); | |
38 case 3, | |
39 CPD.dirichlet(x(1), x(2), x(3), y) = CPD.dirichlet(x(1), x(2), x(3), y)+1; | |
40 CPD.CPT(x(1), x(2), x(3), :) = CPD.dirichlet(x(1), x(2), x(3), :) ./ sum(CPD.dirichlet(x(1), x(2), x(3), :)); | |
41 otherwise, | |
42 ind = subv2ind(sz, [x y]); | |
43 CPD.dirichlet(ind) = CPD.dirichlet(ind) + 1; | |
44 CPD.CPT = mk_stochastic(CPD.dirichlet); | |
45 end | |
46 else | |
47 if usecell | |
48 data = [cell2num(pev); cell2num(self_ev)]; | |
49 else | |
50 data = [pev; self_ev]; | |
51 end | |
52 counts = compute_counts(data, sz); | |
53 CPD.dirichlet = CPD.dirichlet + counts; | |
54 CPD.CPT = mk_stochastic(CPD.dirichlet); | |
55 end |