Rcpp::List make_new_labels(T labels, S posclass, bool is_pc_na) { // Variables Rcpp::List ret_val; std::string errmsg = ""; std::vector<double> new_labels(labels.size()); int nn = 0; int np = 0; std::set<S> label_set; typename std::set<S>::iterator it; S lab2 = labels[0]; // Check two labels for (unsigned i = 0; i < labels.size(); ++i) { label_set.insert(labels[i]); } // Find positive label if (is_pc_na) { if (label_set.size() != 2) { ret_val["errmsg"] = "invalid-labels"; return ret_val; } for (it = label_set.begin(); it != label_set.end(); ++it) { if (lab2 < *it) { lab2 = *it; } } } else { it = label_set.find(posclass); if (it == label_set.end()) { ret_val["errmsg"] = "invalid-posclass"; return ret_val; } lab2 = posclass; } // Make new labels - negative 1 & positive 2 for (unsigned i = 0; i < labels.size(); ++i) { if (labels[i] == lab2) { ++np; new_labels[i] = 2; } else { ++nn; new_labels[i] = 1; } } ret_val["nn"] = nn; ret_val["np"] = np; ret_val["labels"] = new_labels; ret_val["errmsg"] = errmsg; return ret_val; }
// Function takes v, w1 & w2 and computes labels: // (v_lt * (v < v1_thresh)) | // (w1_lt * (w1 < w1_thresh) && // w2_lt * (w2 < w2_thresh)) = -1 // else = +1 // // [[Rcpp::export]] float ClassificationError(Rcpp::NumericVector v, float v_thresh, bool v_lt, Rcpp::NumericVector w1, float w1_thresh, bool w1_lt, Rcpp::NumericVector w2, float w2_thresh, bool w2_lt, Rcpp::NumericVector label) { assert(v.size() == w1.size()); assert(w1.size() == w2.size()); std::vector<int> new_labels(v.size(),0); int err = 0; int count = 0; for (int i = 0 ; i < v.size() ; i++) { bool v_ok = lt_toggle( v[i], v_thresh, v_lt); bool w1_ok= lt_toggle(w1[i], w1_thresh, w1_lt); bool w2_ok= lt_toggle(w2[i], w2_thresh, w2_lt); int label_i = 0; if (v_ok || (w1_ok && w2_ok)) { label_i = -1; } else { label_i = 1; } if (label[i] != 0) { if (label_i != label[i]) { err++; } count++; } } return float(err) / float(count); }