Beispiel #1
0
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;
}
Beispiel #2
0
// 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);
}