void AdaBoost::trainRound() { calcWeightSum(); DecisionStump bestClassifier; for (int featureIndex = 0; featureIndex < featureTotal_; ++featureIndex) { DecisionStump optimalClassifier = learnOptimalClassifier(featureIndex); if (optimalClassifier.featureIndex() < 0) continue; if (bestClassifier.error() < 0 || optimalClassifier.error() < bestClassifier.error()) { bestClassifier = optimalClassifier; } } updateWeight(bestClassifier); weakClassifiers_.push_back(bestClassifier); }
vector<int> slashBurn(Graph &graph, int K) { //printGraph(graph); int p = 0, q = (int)graph.size() - 1; vector<int> weightsum(q + 1, 0); vector<int> idX(q + 1, 0), xId(q + 1, 0); for(int i = 0; i < q + 1; i++){ idX[i] = xId[i] = i; } calcWeightSum(weightsum, graph); while(q - p + 1 > K){ if(TKDE){ /* TKDE: select topK in greedy way */ for(int i = 0; i < K; i++, p++){ int maxloc = select_biggest(weightsum, xId, p, q); remove_vertex_from_graph(graph, xId[maxloc], weightsum); iter_swap(idX.begin() + xId[p], idX.begin() + xId[maxloc]); iter_swap(xId.begin() + maxloc, xId.begin() + p); } } else{ /* ICDM: select topK directly */ vector<int> maxloc = select_topk(weightsum, xId, p, q, K); for(vector<int>::iterator it = maxloc.begin(); it != maxloc.end(); ++it, p++){ remove_vertex_from_graph(graph, xId[*it], weightsum); iter_swap(idX.begin() + xId[p], idX.begin() + xId[*it]); iter_swap(xId.begin() + *it, xId.begin() + p); } } //Map or vector, trade-off between space and time vector<int> vertexCC(graph.size(), 0); vector<pair<int, int> > ccMetric(graph.size()); find_cc(graph, p, q, xId, idX, vertexCC, ccMetric); vector<int> newx2X; int Q = sort_vertex(newx2X, vertexCC, ccMetric); if(Q == -1){ break; } for(int i = Q; i < (int)newx2X.size(); i++){ remove_vertex_from_graph(graph, xId[newx2X[i]], weightsum); } shuffle_vertex(newx2X, xId, idX, p); q = p + Q - 1; } return idX; }