Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@math/loglikelihood_td.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/+utils/@math/loglikelihood_td.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,157 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Compute log-likelihood in time domain assuming a multivariate gaussian +% distribution +% +% INPUT +% +% - res, a vector of AOs containing residuals +% - noise, a vector of AOs containing noise +% - cutbefore, followed by the data samples to cut at the starting of the +% data series +% - cutafter, followed by the data samples to cut at the ending of the +% data series +% +% L Ferraioli 10-10-2010 +% +% $Id: loglikelihood_td.m,v 1.1 2011/03/15 16:19:20 miquel Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function loglk = loglikelihood_td(res,noise,varargin) + + cutbefore = []; + cutafter = []; + if ~isempty(varargin) + for j=1:length(varargin) + if strcmp(varargin{j},'cutbefore') + cutbefore = varargin{j+1}; + end + if strcmp(varargin{j},'cutafter') + cutafter = varargin{j+1}; + end + end + end + + nres = numel(res); + loglk = 0; + + for ii=1:nres + + yres = res(ii).y; + ynoise = noise(ii).y; + % willing to work with rows + if size(yres,2)<size(yres,1) + yres = yres.'; + end + if size(ynoise,2)<size(ynoise,1) + ynoise = ynoise.'; + end + if ~isempty(cutbefore) + yres(1:cutbefore) = []; + ynoise(1:cutbefore) = []; + end + if ~isempty(cutafter) + yres(end-cutafter:end) = []; + ynoise(end-cutafter:end) = []; + end + +% R = utils.math.Rcovmat(yres); +% +% xx = R\yres.'; +% Ndim = numel(yres); +% +% loglk = loglk + abs(xx'*xx)./Ndim; + + cmat = utils.math.xCovmat(ynoise); + + [L,p] = chol(cmat,'lower'); + if p==0 + xx = L\yres.'; + Ndim = numel(yres); + else + q = p-1; + yyres = yres(1:q); + + xx = L\yyres.'; + Ndim = numel(yyres); + end + + loglk = loglk + abs(xx'*xx)./Ndim; + + + end + + + %%% get cros terms + if nres>1 + + for ii=1:nres-1 + for jj=ii+1:nres + + yres1 = res(ii).y; + yres2 = res(jj).y; + ynoise1 = noise(ii).y; + ynoise2 = noise(jj).y; + % willing to work with rows + if size(yres1,2)<size(yres1,1) + yres1 = yres1.'; + end + if size(yres2,2)<size(yres2,1) + yres2 = yres2.'; + end + if size(ynoise1,2)<size(ynoise1,1) + ynoise1 = ynoise1.'; + end + if size(ynoise2,2)<size(ynoise2,1) + ynoise2 = ynoise2.'; + end + if ~isempty(cutbefore) + yres1(1:cutbefore) = []; + yres2(1:cutbefore) = []; + ynoise1(1:cutbefore) = []; + ynoise2(1:cutbefore) = []; + end + if ~isempty(cutafter) + yres1(end-cutafter:end) = []; + yres2(end-cutafter:end) = []; + ynoise1(end-cutafter:end) = []; + ynoise2(end-cutafter:end) = []; + end + +% Rx = utils.math.Rcovmat(yres1); +% Ry = utils.math.Rcovmat(yres2); +% +% xx = Rx\yres1.'; +% yy = Ry\yres2.'; +% +% Ndim = numel(yres1); +% +% loglk = loglk + 2.*abs(xx'*yy)./Ndim; + + cmat = utils.math.xCovmat(ynoise1,ynoise2); + + [L,p] = chol(cmat,'lower'); + if p==0 + xx = L\yres1.'; + Ndim = numel(yres1); + yy = L\yres2.'; + else + q = p-1; + yyres1 = yres1(1:q); + yyres2 = yres2(1:q); + + xx = L\yyres1.'; + Ndim = numel(yyres1); + yy = L\yyres2.'; + end + + loglk = loglk + 2.*abs(xx'*yy)./Ndim; + + + end + end + + end + + +end \ No newline at end of file