classdef TabularCPD < CondProbDist
properties
T;
sizes;
pseudoCounts;
end
methods
function obj = TabularCPD(T, varargin)
if(nargin == 0),T=[];end
obj.sizes = sizePMTK(T);
sz = obj.sizes; r = sz(end); q = prod(sz(1:end-1));
[prior] = process_options(varargin, ...
'prior', 'none');
obj.T = T;
switch lower(prior)
case 'bdeu', C = onesPMTK(sz)*1/(q*r);
case 'laplace', C = onesPMTK(sz)*1;
case 'none', C = 0*onesPMTK(sz);
end
obj.pseudoCounts = C;
end
function p = isDiscrete(CPD)
p = true;
end
function q = nstates(CPD)
q = CPD.sizes(end);
end
function Tfac = convertToTabularFactor(CPD, child, ctsParents, dParents, visible, data, nstates)
assert(isempty(ctsParents))
fam = [dParents(:)' child];
Tfac = TabularFactor(CPD.T, fam);
visFam = fam(visible(fam));
Tfac = slice(Tfac, visFam, data(visFam));
end
function ll = logprob(obj, Xpa, Xself)
X = [Xpa Xself];
sz = sizePMTK(obj.T);
ndx = subv2ind(sz, X);
ll = log(obj.T(ndx));
ll = ll(:);
end
function L = logmarglik(obj, Xpa, Xself)
X = [Xpa Xself];
sz = obj.sizes;
r = sz(end); q = prod(sz(1:end-1));
counts = compute_counts(X', obj.sizes);
L = sum(logmarglikDirichletMultinom(reshape(counts,q,r),...
reshape(obj.pseudoCounts,q,r)));
end
function obj = fit(obj, varargin)
[X, y] = process_options(varargin, ...
'X', [], 'y', []);
counts = compute_counts([X y]', obj.sizes);
obj.T = mkStochastic(counts + obj.pseudoCounts);
end
function y = sample(obj, X, n)
y = zeros(n,1);
sz = sizePMTK(obj.T); r = sz(end);
psz = sz(1:end-1);
q = prod(psz);
if length(sz)==1
y = sampleDiscrete(obj.T, n, 1);
else
assert(n==size(X,1))
T = reshape(obj.T, q, r);
ndx = subv2ind(psz, X);
for i=1:n
y(i) = sampleDiscrete(T(ndx(i),:));
end
end
end
end
end