4 #include <gsl/gsl_linalg.h>
7 // TODO: comment on constructionModelesLassoMLE purpose
8 void constructionModelesLassoMLE_core(
10 const float* phiInit
, // parametre initial de moyenne renormalisé
11 const float* rhoInit
, // parametre initial de variance renormalisé
12 const float* piInit
,// parametre initial des proportions
13 const float* gamInit
, // paramètre initial des probabilités a posteriori de chaque échantillon
14 int mini
,// nombre minimal d'itérations dans l'algorithme EM
15 int maxi
,// nombre maximal d'itérations dans l'algorithme EM
16 float gamma
,// valeur de gamma : puissance des proportions dans la pénalisation pour un Lasso adaptatif
17 const float* glambda
, // valeur des paramètres de régularisation du Lasso
18 const float* X
, // régresseurs
19 const float* Y
, // réponse
20 float seuil
,// seuil pour prendre en compte une variable
21 float tau
,// seuil pour accepter la convergence
22 const int* A1
, // matrice des coefficients des parametres selectionnes
23 const int* A2
, // matrice des coefficients des parametres non selectionnes
25 float* phi
,// estimateur ainsi calculé par le Lasso
26 float* rho
,// estimateur ainsi calculé par le Lasso
27 float* pi
, // estimateur ainsi calculé par le Lasso
28 float* lvraisemblance
, // estimateur ainsi calculé par le Lasso
29 // additional size parameters
30 int n
, // taille de l'echantillon
31 int p
, // nombre de covariables
32 int m
, // taille de Y (multivarié)
33 int k
, // nombre de composantes
34 int L
) // taille de glambda
36 //preparation: phi = 0
37 for (int u
=0; u
<p
*m
*k
*L
; u
++)
40 //initiate parallel section
42 omp_set_num_threads(OMP_NUM_THREADS
);
43 #pragma omp parallel default(shared) private(lambdaIndex)
45 #pragma omp for schedule(dynamic,CHUNK_SIZE) nowait
46 for (lambdaIndex
=0; lambdaIndex
<L
; lambdaIndex
++)
48 //~ a = A1(:,1,lambdaIndex);
50 int* a
= (int*)malloc(p
*sizeof(int));
52 for (int j
=0; j
<p
; j
++)
54 if (A1
[ai(j
,0,lambdaIndex
,p
,m
+1,L
)] != 0)
55 a
[lengthA
++] = A1
[ai(j
,0,lambdaIndex
,p
,m
+1,L
)] - 1;
61 float* Xa
= (float*)malloc(n
*lengthA
*sizeof(float));
62 for (int i
=0; i
<n
; i
++)
64 for (int j
=0; j
<lengthA
; j
++)
65 Xa
[mi(i
,j
,n
,lengthA
)] = X
[mi(i
,a
[j
],n
,p
)];
68 //phia = phiInit(a,:,:)
69 float* phia
= (float*)malloc(lengthA
*m
*k
*sizeof(float));
70 for (int j
=0; j
<lengthA
; j
++)
72 for (int mm
=0; mm
<m
; mm
++)
74 for (int r
=0; r
<k
; r
++)
75 phia
[ai(j
,mm
,r
,lengthA
,m
,k
)] = phiInit
[ai(a
[j
],mm
,r
,p
,m
,k
)];
79 //[phiLambda,rhoLambda,piLambda,~,~] = EMGLLF(...
80 // phiInit(a,:,:),rhoInit,piInit,gamInit,mini,maxi,gamma,0,X(:,a),Y,tau);
81 float* phiLambda
= (float*)malloc(lengthA
*m
*k
*sizeof(float));
82 float* rhoLambda
= (float*)malloc(m
*m
*k
*sizeof(float));
83 float* piLambda
= (float*)malloc(k
*sizeof(float));
84 float* LLF
= (float*)malloc((maxi
+1)*sizeof(float));
85 float* S
= (float*)malloc(lengthA
*m
*k
*sizeof(float));
86 EMGLLF_core(phia
,rhoInit
,piInit
,gamInit
,mini
,maxi
,gamma
,0.0,Xa
,Y
,tau
,
87 phiLambda
,rhoLambda
,piLambda
,LLF
,S
,
95 //~ phi(a(j),:,:,lambdaIndex) = phiLambda(j,:,:);
97 for (int j
=0; j
<lengthA
; j
++)
99 for (int mm
=0; mm
<m
; mm
++)
101 for (int r
=0; r
<k
; r
++)
102 phi
[ai4(a
[j
],mm
,r
,lambdaIndex
,p
,m
,k
,L
)] = phiLambda
[ai(j
,mm
,r
,p
,m
,k
)];
106 //~ rho(:,:,:,lambdaIndex) = rhoLambda;
107 for (int u
=0; u
<m
; u
++)
109 for (int v
=0; v
<m
; v
++)
111 for (int r
=0; r
<k
; r
++)
112 rho
[ai4(u
,v
,r
,lambdaIndex
,m
,m
,k
,L
)] = rhoLambda
[ai(u
,v
,r
,m
,m
,k
)];
116 //~ pi(:,lambdaIndex) = piLambda;
117 for (int r
=0; r
<k
; r
++)
118 pi
[mi(r
,lambdaIndex
,k
,L
)] = piLambda
[r
];
122 int* b
= (int*)malloc(m
*sizeof(int));
123 for (int j
=0; j
<p
; j
++)
125 //~ b = A2(j,2:end,lambdaIndex);
128 for (int mm
=0; mm
<m
; mm
++)
130 if (A2
[ai(j
,mm
+1,lambdaIndex
,p
,m
+1,L
)] != 0)
131 b
[lengthB
++] = A2
[ai(j
,mm
+1,lambdaIndex
,p
,m
+1,L
)] - 1;
134 //~ phi(A2(j,1,lambdaIndex),b,:,lambdaIndex) = 0.0;
138 for (int mm
=0; mm
<lengthB
; mm
++)
140 for (int r
=0; r
<k
; r
++)
141 phi
[ai4( A2
[ai(j
,0,lambdaIndex
,p
,m
+1,L
)]-1, b
[mm
], r
, lambdaIndex
, p
, m
, k
, L
)] = 0.;
145 //~ c = A1(j,2:end,lambdaIndex);
147 //~ dimension = dimension + length(c);
148 for (int mm
=0; mm
<m
; mm
++)
150 if (A1
[ai(j
,mm
+1,lambdaIndex
,p
,m
+1,L
)] != 0)
157 float* densite
= (float*)calloc(L
*n
,sizeof(float));
158 float sumLogDensit
= 0.0;
159 gsl_matrix
* matrix
= gsl_matrix_alloc(m
, m
);
160 gsl_permutation
* permutation
= gsl_permutation_alloc(m
);
161 float* YiRhoR
= (float*)malloc(m
*sizeof(float));
162 float* XiPhiR
= (float*)malloc(m
*sizeof(float));
163 for (int i
=0; i
<n
; i
++)
166 //~ delta = Y(i,:)*rho(:,:,r,lambdaIndex) - (X(i,a)*(phi(a,:,r,lambdaIndex)));
167 //~ densite(i,lambdaIndex) = densite(i,lambdaIndex) +...
168 //~ pi(r,lambdaIndex)*det(rho(:,:,r,lambdaIndex))/(sqrt(2*PI))^m*exp(-dot(delta,delta)/2.0);
170 for (int r
=0; r
<k
; r
++)
172 //compute det(rho(:,:,r,lambdaIndex)) [TODO: avoid re-computations]
173 for (int u
=0; u
<m
; u
++)
175 for (int v
=0; v
<m
; v
++)
176 matrix
->data
[u
*m
+v
] = rho
[ai4(u
,v
,r
,lambdaIndex
,m
,m
,k
,L
)];
178 gsl_linalg_LU_decomp(matrix
, permutation
, &signum
);
179 float detRhoR
= gsl_linalg_LU_det(matrix
, signum
);
181 //compute Y(i,:)*rho(:,:,r,lambdaIndex)
182 for (int u
=0; u
<m
; u
++)
185 for (int v
=0; v
<m
; v
++)
186 YiRhoR
[u
] += Y
[mi(i
,v
,n
,m
)] * rho
[ai4(v
,u
,r
,lambdaIndex
,m
,m
,k
,L
)];
189 //compute X(i,a)*phi(a,:,r,lambdaIndex)
190 for (int u
=0; u
<m
; u
++)
193 for (int v
=0; v
<lengthA
; v
++)
194 XiPhiR
[u
] += X
[mi(i
,a
[v
],n
,p
)] * phi
[ai4(a
[v
],u
,r
,lambdaIndex
,p
,m
,k
,L
)];
196 // On peut remplacer X par Xa dans ce dernier calcul, mais je ne sais pas si c'est intéressant ...
198 // compute dotProduct < delta . delta >
199 float dotProduct
= 0.0;
200 for (int u
=0; u
<m
; u
++)
201 dotProduct
+= (YiRhoR
[u
]-XiPhiR
[u
]) * (YiRhoR
[u
]-XiPhiR
[u
]);
203 densite
[mi(lambdaIndex
,i
,L
,n
)] += (pi
[mi(r
,lambdaIndex
,k
,L
)]*detRhoR
/pow(sqrt(2.0*M_PI
),m
))*exp(-dotProduct
/2.0);
205 sumLogDensit
+= log(densite
[lambdaIndex
*n
+i
]);
207 lvraisemblance
[mi(lambdaIndex
,0,L
,2)] = sumLogDensit
;
208 lvraisemblance
[mi(lambdaIndex
,1,L
,2)] = (dimension
+m
+1)*k
-1;
214 gsl_matrix_free(matrix
);
215 gsl_permutation_free(permutation
);