fix memory leaks on EMGLLF, test OK for EMGrank
[valse.git] / src / test / generate_test_data / helpers / constructionModelesLassoMLE.m
1 function[phi,rho,pi,llh] = constructionModelesLassoMLE(...
2 phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,glambda,X,Y,seuil,tau,A1,A2)
3
4 PI = 4.0 * atan(1.0);
5
6 %get matrix sizes
7 n = size(X, 1);
8 [p,m,k] = size(phiInit);
9 L = length(glambda);
10
11 %output parameters
12 phi = zeros(p,m,k,L);
13 rho = zeros(m,m,k,L);
14 pi = zeros(k,L);
15 llh = zeros(L,2);
16
17 for lambdaIndex=1:L
18 % Procedure Lasso-MLE
19 a = A1(:,1,lambdaIndex);
20 a(a==0) = [];
21 if length(a) == 0
22 continue;
23 end
24 [phiLambda,rhoLambda,piLambda,~,~] = EMGLLF(...
25 phiInit(a,:,:),rhoInit,piInit,gamInit,mini,maxi,gamma,0,X(:,a),Y,tau);
26
27 for j=1:length(a)
28 phi(a(j),:,:,lambdaIndex) = phiLambda(j,:,:);
29 end
30 rho(:,:,:,lambdaIndex) = rhoLambda;
31 pi(:,lambdaIndex) = piLambda;
32
33 dimension = 0;
34 for j=1:p
35 b = A2(j,2:end,lambdaIndex);
36 b(b==0) = [];
37 if length(b) > 0
38 phi(A2(j,1,lambdaIndex),b,:,lambdaIndex) = 0.0;
39 end
40 c = A1(j,2:end,lambdaIndex);
41 c(c==0) = [];
42 dimension = dimension + length(c);
43 end
44
45 %on veut calculer l'EMV avec toutes nos estimations
46 densite = zeros(n,L);
47 for i=1:n
48 for r=1:k
49 delta = Y(i,:)*rho(:,:,r,lambdaIndex) - (X(i,a)*(phi(a,:,r,lambdaIndex)));
50 densite(i,lambdaIndex) = densite(i,lambdaIndex) +...
51 pi(r,lambdaIndex)*det(rho(:,:,r,lambdaIndex))/(sqrt(2*PI))^m*exp(-dot(delta,delta)/2.0);
52 end
53 end
54 llh(lambdaIndex,1) = sum(log(densite(:,lambdaIndex)));
55 llh(lambdaIndex,2) = (dimension+m+1)*k-1;
56 end
57
58 end