0001 function [X,T,L1,L2] = gmmbvl_mixgen(n,m,k,d,c,e)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 R=zeros(k,d^2);
0022
0023
0024 while 1
0025 W = rand(k,1);
0026 W = W / sum(W);
0027 if all(W > 1/(4*k))
0028 break;
0029 end
0030 end
0031
0032
0033 trials = 1;
0034 while 1
0035 X = [];
0036 T = [];
0037 M = randn(k,d)*sqrt(k)*sqrt(c)*trials/10;
0038 Trace = zeros(k,1);
0039 for j = 1:k
0040 U = rand(d,d)-0.5;
0041 U = sqrtm(inv(U*U')) * U;
0042 L = diag(rand(d,1)*(e-1)+1).^2/100;
0043 msg = 1;
0044 while msg
0045 [C,msg] = chol(U*L*U');
0046 end
0047 R(j,:)=C(:)';
0048
0049 nj = ceil(n*W(j));
0050 Xj = randn(nj,d) * C;
0051 X = [X; repmat(M(j,:),nj,1) + Xj];
0052 Trace(j) = trace(cov(Xj));
0053
0054 mj = ceil(m*W(j));
0055 Tj = randn(mj,d) * C;
0056 T = [T; repmat(M(j,:),mj,1) + Tj];
0057
0058 end
0059
0060 error = 0;
0061 for i = 1:k-1
0062 for j = i+1:k
0063 if norm(M(i,:)-M(j,:)) < c * sqrt(max(Trace(i),Trace(j)))
0064 error = 1;
0065 end
0066 end
0067 end
0068 if ~error
0069 break;
0070 end
0071 trials = trials + 1;
0072 end
0073
0074 L = gmmbvl_em_gauss(X,M,R);
0075 F = L*W;
0076 F(find(F < eps)) = eps;
0077 L1 = mean(log(F));
0078 if ~isempty(T)
0079 L = gmmbvl_em_gauss(T,M,R);
0080 F = L*W;
0081 F(find(F < eps)) = eps;
0082 L2 = mean(log(F));
0083 end