void updateNu(int *seed, int *nAccept, double *nu, const int *Q, const int *G, const int *S, const double *x, const int *psi, const int *delta, const double *Delta, const double *gamma2, const double *rho, const double *sigma2, const double *phi, const double *tau2Rho, const double *a) { unsigned int seedU = (unsigned int) *seed; updateNu(&seedU,nAccept,nu,*Q,*G,S,x,psi,delta,Delta,*gamma2, rho,sigma2,phi,tau2Rho,a); *seed = (int) seedU; return; }
void LogConCenPH::moveCovOrBase(int i, double delta){ int numCov = cov_b.size(); if(i < numCov){ cov_b[i] = cov_b[i] + delta; updateNu(); return; } int ind = actIndex[i - numCov]; move_act_b(ind, delta); }
void IBCC::train(int noItr) { initialize(); for(int i=0; i < noItr; ++i) { cerr << "VB Iteration " << (i+1) << "..." << endl; // E-step lblCnts(i==0); // get class counts baseCnts(i==0); // get base classifiers counts // M-step updateNu(); // update class priors expctKappa(); // compute class expectations updateAlpha(); // update base classifiers priors expctPi(); // compute base classifiers expectations // E-step expctRho(); } }
double LogConCenPH::nullk(){ // int k = x.size(); updateNu(); // double scaleValue = (1 - augLeft - augRight) / s[k-1]; double logScale = log(scaleValue); // for(int i = 0; i < k; i++) // s[i] = s[i] * scaleValue + augLeft; int n_row = Lindex.size(); // double tot_rvec = 0; double log_sum = 0; double p_ob = 0; int hi_ind; int lo_ind; for(int i = 0; i < n_row; i++){ hi_ind = Rindex[i]; lo_ind = Lindex[i]; if(hi_ind == lo_ind){ if( abs(nu[i] - 1) > 0.000000001 ) log_sum += log(nu[i]) + (b[lo_ind] + logScale) + (nu[i]-1) * log(1-s[hi_ind]); else log_sum += (b[lo_ind] + logScale); continue; } p_ob = pow(1-s[lo_ind], nu[i]) - pow(1-s[hi_ind], nu[i]); if(!(p_ob > 0) ) { return(R_NegInf); } log_sum += log(p_ob); } if(log_sum == R_PosInf || log_sum == R_NegInf){ return(R_NegInf); } if(log_sum != log_sum){ return(R_NegInf); } return (log_sum); }