wolffd@0: function CPD = maximize_params(CPD, temp) wolffd@0: % MAXIMIZE_PARAMS Set the params of a CPD to their ML values (Gaussian) wolffd@0: % CPD = maximize_params(CPD, temperature) wolffd@0: % wolffd@0: % Temperature is currently ignored. wolffd@0: wolffd@0: if ~adjustable_CPD(CPD), return; end wolffd@0: wolffd@0: wolffd@0: if CPD.clamped_mean wolffd@0: cl_mean = CPD.mean; wolffd@0: else wolffd@0: cl_mean = []; wolffd@0: end wolffd@0: wolffd@0: if CPD.clamped_cov wolffd@0: cl_cov = CPD.cov; wolffd@0: else wolffd@0: cl_cov = []; wolffd@0: end wolffd@0: wolffd@0: if CPD.clamped_weights wolffd@0: cl_weights = CPD.weights; wolffd@0: else wolffd@0: cl_weights = []; wolffd@0: end wolffd@0: wolffd@0: [ssz psz Q] = size(CPD.weights); wolffd@0: wolffd@0: [ss cpsz dpsz] = size(CPD.weights); % ss = self size = ssz wolffd@0: if cpsz > CPD.nsamples wolffd@0: fprintf('gaussian_CPD/maximize_params: warning: input dimension (%d) > nsamples (%d)\n', ... wolffd@0: cpsz, CPD.nsamples); wolffd@0: end wolffd@0: wolffd@0: prior = repmat(CPD.cov_prior_weight*eye(ssz,ssz), [1 1 Q]); wolffd@0: wolffd@0: wolffd@0: [CPD.mean, CPD.cov, CPD.weights] = ... wolffd@0: clg_Mstep(CPD.Wsum, CPD.WYsum, CPD.WYYsum, [], CPD.WXsum, CPD.WXXsum, CPD.WXYsum, ... wolffd@0: 'cov_type', CPD.cov_type, 'clamped_mean', cl_mean, ... wolffd@0: 'clamped_cov', cl_cov, 'clamped_weights', cl_weights, ... wolffd@0: 'tied_cov', CPD.tied_cov, ... wolffd@0: 'cov_prior', prior); wolffd@0: wolffd@0: if 0 wolffd@0: CPD.mean = reshape(CPD.mean, [ss dpsz]); wolffd@0: CPD.cov = reshape(CPD.cov, [ss ss dpsz]); wolffd@0: CPD.weights = reshape(CPD.weights, [ss cpsz dpsz]); wolffd@0: end wolffd@0: wolffd@0: % Bug fix 11 May 2003 KPM wolffd@0: % clg_Mstep collapses all discrete parents into one mega-node wolffd@0: % but convert_to_CPT needs access to each parent separately wolffd@0: sz = CPD.sizes; wolffd@0: ss = sz(end); wolffd@0: wolffd@0: % Bug fix KPM 20 May 2003: wolffd@0: cpsz = sum(sz(CPD.cps)); wolffd@0: %if isempty(CPD.cps) wolffd@0: % cpsz = 0; wolffd@0: %else wolffd@0: % cpsz = sz(CPD.cps); wolffd@0: %end wolffd@0: dpsz = sz(CPD.dps); wolffd@0: CPD.mean = myreshape(CPD.mean, [ss dpsz]); wolffd@0: CPD.cov = myreshape(CPD.cov, [ss ss dpsz]); wolffd@0: CPD.weights = myreshape(CPD.weights, [ss cpsz dpsz]);