int shortems(int n,int p,int nclass,double *pi,double **X,double **Mu, double **LTSigma,int maxshortiter,double shorteps) { /*initializing as per Beiernacki, Celeaux, Govaert~(2003) */ int i,iter,totiter=0; double *oldpi,**oldMu,**oldLTSigma,oldllh=-Inf,llhval; MAKE_VECTOR(oldpi,nclass); MAKE_MATRIX(oldMu,nclass,p); MAKE_MATRIX(oldLTSigma,nclass,p*(p+1)/2); do { /* Modified by Wei-Chen Chen on 2009/03/08. i=randomEMinit(X,n,p,nclass,oldpi,oldMu,oldLTSigma); i = mb_randomEMinit(X, n, p, nclass, oldpi, oldMu, oldLTSigma); */ i = randomEMinit(X, n, p, nclass, oldpi, oldMu, oldLTSigma); iter=maxshortiter-totiter; iter=shortemcluster(n,p,nclass,oldpi,X,oldMu,oldLTSigma,iter,shorteps, &llhval); if (llhval >= oldllh) { int i; oldllh=llhval; cpy(oldMu,nclass,p,Mu); cpy(oldLTSigma,nclass,p*(p+1)/2,LTSigma); for(i=0;i<nclass;i++) pi[i]=oldpi[i]; } totiter+=iter; } while (totiter < maxshortiter); FREE_MATRIX(oldMu); FREE_MATRIX(oldLTSigma); FREE_VECTOR(oldpi); return totiter; }
/* shortems() for model-based initializer. */ void shortems_mb(int n,int p,int nclass,double *pi,double **X,double **Mu, double **LTSigma,int maxshortiter,double shorteps){ int i, iter, totiter = 0, n_par = p * (p + 1) / 2; double *oldpi, **oldMu, **oldLTSigma, oldllh = -Inf, llhval; MAKE_VECTOR(oldpi, nclass); MAKE_MATRIX(oldMu, nclass, p); MAKE_MATRIX(oldLTSigma, nclass, n_par); do{ mb_init(X, n, p, nclass, oldpi, oldMu, oldLTSigma); iter = maxshortiter - totiter; iter = shortemcluster(n, p, nclass, oldpi, X, oldMu, oldLTSigma, iter, shorteps, &llhval); if(llhval >= oldllh){ oldllh = llhval; cpy(oldMu, nclass, p, Mu); cpy(oldLTSigma, nclass, n_par, LTSigma); for(i = 0; i < nclass; i++) pi[i] = oldpi[i]; } totiter += iter; } while(totiter < maxshortiter); FREE_MATRIX(oldMu); FREE_MATRIX(oldLTSigma); FREE_VECTOR(oldpi); } /* End of shortems_mb(). */