0001 function [Mus, Covs, Ws]=gmmbvl_rand_split(P,X,M,R,sigma,F,W,nr_of_cand)
0002
0003
0004
0005 k = size(R,1);
0006 [n,d] = size(X);
0007
0008 epsilon = 1e-2;
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
0028
0029
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
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)
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