Home > gmmbayestb-v1.0 > gmmbvl_rand_split.m

gmmbvl_rand_split

PURPOSE ^

SYNOPSIS ^

function [Mus, Covs, Ws]=gmmbvl_rand_split(P,X,M,R,sigma,F,W,nr_of_cand)

DESCRIPTION ^

 $Name:  $

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [Mus, Covs, Ws]=gmmbvl_rand_split(P,X,M,R,sigma,F,W,nr_of_cand)
0002 %
0003 % $Name:  $
0004 
0005 k       = size(R,1);
0006 [n,d]   = size(X);
0007 
0008 epsilon = 1e-2;      % threshold in relative loglikelihood improvement for convergence in local partial EM
0009 
0010 [tmp,I] = max(P,[],2);
0011 
0012 Mus = [];
0013 Covs = [];
0014 K = [];
0015 Ws = [];
0016 KL = [];
0017 
0018 
0019 
0020 for i=1:k
0021         
0022     XI        = find(I==i);
0023     Xloc      = X(XI,:);
0024     start     = size(Mus,1);
0025     j=0;
0026 
0027     if length(XI) > 2*d  % generate candidates for this parent
0028 
0029         % number of candidates per parent component
0030         while j < nr_of_cand
0031             r  = randperm(length(XI));
0032             r  = r(1:2);
0033             if d==1
0034                 cl = [Xloc-Xloc(r(1)) Xloc-Xloc(r(2))];
0035                 [tmp,cl] = min(cl.^2,[],2);
0036             else            
0037                 cl = gmmbvl_sqdist( Xloc', Xloc(r,:)' );
0038                 [tmp,cl] = min(cl,[],2);
0039             end
0040             for guy = 1:2
0041                 data = Xloc( find( cl==guy ), :);
0042                 if size(data,1) > d
0043                     j = j + 1;
0044                     Mus  = [Mus; mean(data)];
0045                     Rloc = cov(data) + eye(d)*eps;
0046                     Rloc = chol(Rloc);
0047                     Covs = [Covs; Rloc(:)'];
0048                     Ws   = [Ws W(i)/2];
0049                     Knew = zeros(n,1);
0050                     Knew(XI) = gmmbvl_em_gauss( ...
0051                        Xloc,Mus(end,:),Covs(end,:) );
0052                     K = [K Knew];
0053                 end
0054             end
0055         end
0056     end
0057 
0058 
0059     last=size(Mus,1);
0060     if last > start
0061         % if candidates were added, do local partial EM
0062         alpha = Ws(start+1:last);
0063         K2 = K(XI,start+1:last);
0064         Mnew = Mus(start+1:last,:);
0065         Rnew = Covs(start+1:last,:);
0066         FF   = F(XI)*ones(1,last-start);
0067         PP   = FF.*(ones(length(XI),1)*(1-alpha)) + ...
0068                   K2.*(ones(length(XI),1)*alpha);
0069         Pnew = (K2.*(ones(length(XI),1)*alpha))./PP;
0070         OI   = ones(n,1);
0071         OI(XI) = 0;
0072         OI = find(OI==1);
0073         lpo   = sum(log(F(OI)));
0074         ll = sum(log(PP)) + length(OI)*log(1-alpha)+lpo;
0075         ll = ll/n;
0076         done = 0;
0077         iter = 1;
0078         
0079         while ~done
0080             [alpha,Mnew,Rnew] = gmmbvl_em_step_partial( ...
0081                Xloc, alpha, Mnew, Rnew, Pnew, n, 0 );
0082             K2 = gmmbvl_em_gauss(Xloc,Mnew,Rnew);
0083             Fnew = FF.*(ones(length(XI),1)*(1-alpha)) + ...
0084                K2.*(ones(length(XI),1)*alpha);
0085             old_ll = ll;
0086             ll = sum(log(Fnew))+length(OI)*log(1-alpha)+lpo;
0087             ll = ll/n;
0088             done = abs(max(ll/old_ll -1)) < epsilon;
0089             if iter > 20
0090                 done=1;
0091             end;
0092             iter = iter+1;
0093             Pnew = (K2.*(ones(length(XI),1)*alpha))./Fnew;
0094         end   
0095         Pnew(find(Pnew<eps)) = eps;
0096         Pnew(find(Pnew==1)) = 1-eps;
0097         Ws(start+1:last) = alpha;
0098         Mus(start+1:last,:) = Mnew;
0099         Covs(start+1:last,:) = Rnew;
0100         KL = [KL n*log(1-alpha)-sum(log(1-Pnew))];
0101     end
0102 end
0103 
0104 I = [];
0105 for i=1:length(Ws) % remove some candiates that are unwanted
0106     S = reshape(Covs(i,:),d,d);
0107     S = S'*S;
0108     S = min(eig(S));
0109     if (S<sigma/400 | Ws(i)<2*d/n  | Ws(i)>.99)
0110         I = [I i];
0111     end
0112 end
0113 Ws(I) = [];
0114 KL(I) = [];
0115 Mus(I,:) = [];
0116 Covs(I,:) = [];
0117 
0118 
0119 if isempty(Ws)
0120     Ws = 0;
0121 else
0122     [logl sup] = max(KL);
0123     sup = sup(1);
0124     Mus = Mus(sup,:);
0125     Covs = Covs(sup,:);
0126     Ws = Ws(sup);
0127 end
0128 
0129

Generated on Thu 14-Apr-2005 13:50:22 by m2html © 2003