qFinderDMM::qFinderDMM(vector<vector<int> > cm, int p): countMatrix(cm), numPartitions(p){ try { m = MothurOut::getInstance(); numSamples = (int)countMatrix.size(); numOTUs = (int)countMatrix[0].size(); kMeans(); // cout << "done kMeans" << endl; optimizeLambda(); // cout << "done optimizeLambda" << endl; double change = 1.0000; currNLL = 0.0000; int iter = 0; while(change > 1.0e-6 && iter < 100){ // cout << "Calc_Z: "; calculatePiK(); optimizeLambda(); // printf("Iter:%d\t",iter); for(int i=0;i<numPartitions;i++){ weights[i] = 0.0000; for(int j=0;j<numSamples;j++){ weights[i] += zMatrix[i][j]; } // printf("w_%d=%.3f\t",i,weights[i]); } double nLL = getNegativeLogLikelihood(); change = abs(nLL - currNLL); currNLL = nLL; // printf("NLL=%.5f\tDelta=%.4e\n",currNLL, change); iter++; } error.resize(numPartitions); logDeterminant = 0.0000; LinearAlgebra l; for(currentPartition=0;currentPartition<numPartitions;currentPartition++){ error[currentPartition].assign(numOTUs, 0.0000); if(currentPartition > 0){ logDeterminant += (2.0 * log(numSamples) - log(weights[currentPartition])); } vector<vector<double> > hessian = getHessian(); vector<vector<double> > invHessian = l.getInverse(hessian); for(int i=0;i<numOTUs;i++){ logDeterminant += log(abs(hessian[i][i])); error[currentPartition][i] = invHessian[i][i]; } } int numParameters = numPartitions * numOTUs + numPartitions - 1; laplace = currNLL + 0.5 * logDeterminant - 0.5 * numParameters * log(2.0 * 3.14159); bic = currNLL + 0.5 * log(numSamples) * numParameters; aic = currNLL + numParameters; } catch(exception& e) { m->errorOut(e, "qFinderDMM", "qFinderDMM"); exit(1); } }
qFinderDMM::qFinderDMM(vector<vector<int> > cm, int p) : CommunityTypeFinder() { try { //cout << "here" << endl; numPartitions = p; countMatrix = cm; numSamples = (int)countMatrix.size(); numOTUs = (int)countMatrix[0].size(); // if (m->debug) { m->mothurOut("before kmeans\n"); } findkMeans(); //if (m->debug) { m->mothurOut("done kMeans\n"); } optimizeLambda(); //if (m->debug) { m->mothurOut("done optimizeLambda\n"); } double change = 1.0000; currNLL = 0.0000; int iter = 0; while(change > 1.0e-6 && iter < 100){ // if (m->debug) { m->mothurOut("Calc_Z: \n"); } calculatePiK(); optimizeLambda(); // if (m->debug) { m->mothurOut("Iter: " + toString(iter) + "\n"); } for(int i=0;i<numPartitions;i++){ weights[i] = 0.0000; for(int j=0;j<numSamples;j++){ weights[i] += zMatrix[i][j]; } // printf("w_%d=%.3f\t",i,weights[i]); } double nLL = getNegativeLogLikelihood(); change = abs(nLL - currNLL); currNLL = nLL; // printf("NLL=%.5f\tDelta=%.4e\n",currNLL, change); iter++; } //if (m->debug) { m->mothurOut("done while loop\n"); } error.resize(numPartitions); logDeterminant = 0.0000; LinearAlgebra l; for(currentPartition=0;currentPartition<numPartitions;currentPartition++){ error[currentPartition].assign(numOTUs, 0.0000); if (m->debug) { m->mothurOut("current partition = " + toString(currentPartition) + "\n"); } if(currentPartition > 0){ logDeterminant += (2.0 * log(numSamples) - log(weights[currentPartition])); } //if (m->debug) { m->mothurOut("before hession\n"); } vector<vector<double> > hessian = getHessian(); //if (m->debug) { m->mothurOut("after hession\n"); } vector<vector<double> > invHessian = l.getInverse(hessian); //if (m->debug) { m->mothurOut("after inverse\n"); } for(int i=0;i<numOTUs;i++){ logDeterminant += log(abs(hessian[i][i])); error[currentPartition][i] = invHessian[i][i]; } } int numParameters = numPartitions * numOTUs + numPartitions - 1; laplace = currNLL + 0.5 * logDeterminant - 0.5 * numParameters * log(2.0 * 3.14159); bic = currNLL + 0.5 * log(numSamples) * numParameters; aic = currNLL + numParameters; } catch(exception& e) { m->errorOut(e, "qFinderDMM", "qFinderDMM"); exit(1); } }