about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/BNT/CPDs/Old/@root_gaussian_CPD/update_params_complete.m
blob: 7ce58944aac9b7e40daa9d19cbef98099e275748 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function CPD = update_params_complete(CPD, self_ev, pev)
% UPDATE_PARAMS_COMPLETE Bayesian parameter updating given completely observed data (root_gaussian)
% CPD = update_params_complete(CPD, self_ev, pev)
%
% self_ev{m} is the evidence on this node in case m.
% pev{i,m} is the evidence on the i'th parent in case m (ignored)
%
% We update the hyperparams and set the params to the mean of the posterior.

X = cell2num(self_ev);
[k N] = size(X); % each column is a case

one = ones(N,1);
xbar = X*one / N; % = mean(X')'
S = X*(eye(N) - one*one'/N)*X';

n0 = CPD.prior.n;
nn = 1/(n0 + N);
mu0 = CPD.prior.mu;
CPD.prior.mu = nn*(n0*mu0 + N*xbar);
CPD.prior.alpha = CPD.prior.alpha + 0.5*N;
CPD.prior.beta = CPD.prior.beta + 0.5*S + 0.5*nn*N*n0*(mu0-xbar)*(mu0-xbar)';
CPD.prior.n = CPD.prior.n + N;

% set params to their mean
CPD.mu = CPD.prior.mu;
% E[Cov] = E inv(n lambda) = 1/(n (alpha-(k+1)/2)) beta
CPD.Sigma = CPD.prior.beta /(CPD.prior.n * (CPD.prior.alpha - (k+1)/2));