X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=src%2Fsources%2FEMGLLF.c;h=87fd1997517296d47a02733011d40ac5963ad47d;hb=e39bc178cf5de02489ea2dce3869ba6323e18492;hp=96b81b376b9fa61415250faa62c95d99dbf52f17;hpb=493a35bfea6d1210c94ced8fbfe3e572f0389ea5;p=valse.git diff --git a/src/sources/EMGLLF.c b/src/sources/EMGLLF.c index 96b81b3..87fd199 100644 --- a/src/sources/EMGLLF.c +++ b/src/sources/EMGLLF.c @@ -1,31 +1,32 @@ -#include "EMGLLF.h" +#include "utils.h" +#include #include -// TODO: comment on EMGLLF purpose -void EMGLLF( +// TODO: don't recompute indexes every time...... +void EMGLLF_core( // IN parameters - const Real* phiInit, // parametre initial de moyenne renormalisé - const Real* rhoInit, // parametre initial de variance renormalisé - const Real* piInit, // parametre initial des proportions - const Real* gamInit, // paramètre initial des probabilités a posteriori de chaque échantillon - Int mini, // nombre minimal d'itérations dans l'algorithme EM - Int maxi, // nombre maximal d'itérations dans l'algorithme EM - Real gamma, // valeur de gamma : puissance des proportions dans la pénalisation pour un Lasso adaptatif + const Real* phiInit, // parametre initial de moyenne renormalisé + const Real* rhoInit, // parametre initial de variance renormalisé + const Real* piInit, // parametre initial des proportions + const Real* gamInit, // paramètre initial des probabilités a posteriori de chaque échantillon + int mini, // nombre minimal d'itérations dans l'algorithme EM + int maxi, // nombre maximal d'itérations dans l'algorithme EM + Real gamma, // puissance des proportions dans la pénalisation pour un Lasso adaptatif Real lambda, // valeur du paramètre de régularisation du Lasso - const Real* X, // régresseurs - const Real* Y, // réponse - Real tau, // seuil pour accepter la convergence + const Real* X, // régresseurs + const Real* Y, // réponse + Real tau, // seuil pour accepter la convergence // OUT parameters (all pointers, to be modified) - Real* phi, // parametre de moyenne renormalisé, calculé par l'EM - Real* rho, // parametre de variance renormalisé, calculé par l'EM - Real* pi, // parametre des proportions renormalisé, calculé par l'EM - Real* LLF, // log vraisemblance associé à cet échantillon, pour les valeurs estimées des paramètres - Real* S, + Real* phi, // parametre de moyenne renormalisé, calculé par l'EM + Real* rho, // parametre de variance renormalisé, calculé par l'EM + Real* pi, // parametre des proportions renormalisé, calculé par l'EM + Real* LLF, // log vraisemblance associée à cet échantillon, pour les valeurs estimées des paramètres + Real* S, // additional size parameters - mwSize n, // nombre d'echantillons - mwSize p, // nombre de covariables - mwSize m, // taille de Y (multivarié) - mwSize k) // nombre de composantes dans le mélange + int n, // nombre d'echantillons + int p, // nombre de covariables + int m, // taille de Y (multivarié) + int k) // nombre de composantes dans le mélange { //Initialize outputs copyArray(phiInit, phi, p*m*k); @@ -33,7 +34,7 @@ void EMGLLF( copyArray(piInit, pi, k); zeroArray(LLF, maxi); //S is already allocated, and doesn't need to be 'zeroed' - + //Other local variables //NOTE: variables order is always [maxi],n,p,m,k Real* gam = (Real*)malloc(n*k*sizeof(Real)); @@ -57,53 +58,53 @@ void EMGLLF( gsl_permutation* permutation = gsl_permutation_alloc(m); Real* YiRhoR = (Real*)malloc(m*sizeof(Real)); Real* XiPhiR = (Real*)malloc(m*sizeof(Real)); - Real dist = 0.0; - Real dist2 = 0.0; - Int ite = 0; + Real dist = 0.; + Real dist2 = 0.; + int ite = 0; Real EPS = 1e-15; Real* dotProducts = (Real*)malloc(k*sizeof(Real)); - + while (ite < mini || (ite < maxi && (dist >= tau || dist2 >= sqrt(tau)))) { copyArray(phi, Phi, p*m*k); copyArray(rho, Rho, m*m*k); copyArray(pi, Pi, k); - - // Calculs associes a Y et X - for (mwSize r=0; r Real dotProduct = 0.0; - for (mwSize u=0; u n*lambda*pow(pi[r],gamma)) - phi[j*m*k+mm*k+r] = (n*lambda*pow(pi[r],gamma) - S[j*m*k+mm*k+r]) - / Gram2[j*p*k+j*k+r]; + // +sum(phi(j+1:p,mm,r).*transpose(Gram2(j,j+1:p,r))); + S[ai(j,mm,r,p,m,k)] = -rho[ai(mm,mm,r,m,m,k)] * ps2[ai(j,mm,r,p,m,k)] + dotPhiGram2; + if (fabs(S[ai(j,mm,r,p,m,k)]) <= n*lambda*pow(pi[r],gamma)) + phi[ai(j,mm,r,p,m,k)] = 0; + else if (S[ai(j,mm,r,p,m,k)] > n*lambda*pow(pi[r],gamma)) + phi[ai(j,mm,r,p,m,k)] = (n*lambda*pow(pi[r],gamma) - S[ai(j,mm,r,p,m,k)]) + / Gram2[ai(j,j,r,p,p,k)]; else - phi[j*m*k+mm*k+r] = -(n*lambda*pow(pi[r],gamma) + S[j*m*k+mm*k+r]) - / Gram2[j*p*k+j*k+r]; + phi[ai(j,mm,r,p,m,k)] = -(n*lambda*pow(pi[r],gamma) + S[ai(j,mm,r,p,m,k)]) + / Gram2[ai(j,j,r,p,p,k)]; } } } - + ///////////// // Etape E // ///////////// - + int signum; Real sumLogLLF2 = 0.0; - for (mwSize i=0; i + + //compute dotProduct + // < Y(:,i)*rho(:,:,r)-X(i,:)*phi(:,:,r) . Y(:,i)*rho(:,:,r)-X(i,:)*phi(:,:,r) > dotProducts[r] = 0.0; - for (mwSize u=0; udata[u*m+v] = rho[u*m*k+v*k+r]; + for (int v=0; vdata[u*m+v] = rho[ai(u,v,r,m,m,k)]; } gsl_linalg_LU_decomp(matrix, permutation, &signum); Real detRhoR = gsl_linalg_LU_det(matrix, signum); - - Gam[i*k+r] = pi[r] * detRhoR * exp(-0.5*dotProducts[r] + shift); - sumLLF1 += Gam[i*k+r] / pow(2*M_PI,m/2.0); - sumGamI += Gam[i*k+r]; + + Gam[mi(i,r,n,k)] = pi[r] * detRhoR * exp(-0.5*dotProducts[r] + shift); + sumLLF1 += Gam[mi(i,r,n,k)] / pow(2*M_PI,m/2.0); + sumGamI += Gam[mi(i,r,n,k)]; } sumLogLLF2 += log(sumLLF1); - for (mwSize r=0; r EPS - ? Gam[i*k+r] / sumGamI + gam[mi(i,r,n,k)] = sumGamI > EPS + ? Gam[mi(i,r,n,k)] / sumGamI : 0.0; } } //sum(pen(ite,:)) Real sumPen = 0.0; - for (mwSize r=0; r Dist1) Dist1 = tmpDist; } @@ -350,14 +354,14 @@ void EMGLLF( } //Dist2=max(max((abs(rho-Rho))./(1+abs(rho)))); Real Dist2 = 0.0; - for (mwSize u=0; u Dist2) Dist2 = tmpDist; } @@ -365,9 +369,9 @@ void EMGLLF( } //Dist3=max(max((abs(pi-Pi))./(1+abs(Pi)))); Real Dist3 = 0.0; - for (mwSize u=0; u Dist3)