www.pudn.com > HMM1.zip > transmat_train_observed.m


function [transmat, initState] = transmat_train_observed(labels, nstates, varargin)
> transmat_train_observed ML estimation from fully observed data
> function [transmat, initState] = transmat_train_observed(labels, nstates, varargin)
>
> If all sequences have the same length
> labels(ex,t)
> If sequences have different lengths, we use cell arrays
> labels{ex}(t)

[dirichletPriorWeight, mkSymmetric, other] = process_options(...
varargin, 'dirichletPriorWeight', 0, 'mkSymmetric', 0);

if ~iscell(labels)
[numex T] = size(labels);
if T==1
labels = labels';
end
>fprintf('T=>d, numex=>d\n', T, numex);
labels = num2cell(labels,2); > each row gets its own cell
end
numex = length(labels);

counts = zeros(nstates, nstates);
counts1 = zeros(nstates,1);
for s=1:numex
labs = labels{s}; labs = labs(:)';
dat = [labs(1:end-1); labs(2:end)];
counts = counts + compute_counts(dat, [nstates nstates]);
q = labs(1);
counts1(q) = counts1(q) + 1;
end
pseudo_counts = dirichletPriorWeight*ones(nstates, nstates);
if mkSymmetric
counts = counts + counts';
end
transmat = mk_stochastic(counts + pseudo_counts);
initState = normalize(counts1 + dirichletPriorWeight*ones(nstates,1));