AUC
user_9601555
c_cpp
2 years ago
2.0 kB
15
Indexable
#define ARMA_64BIT_WORD
#define ARMA_DONT_USE_CXX11
#define ARMA_USE_MKL_ALLOC
#include <armadillo>
#include "mex.h"
using namespace arma;
typedef struct {
rowvec TPR;
rowvec FPR;
double AUC;
} aucResult, *Ptr_aucResult;
struct PRCalculate {
urowvec& classes;
vec& scores;
vec& thresholds;
uvec& posLocVec;
uvec& negLocVec;
rowvec& TPR;
rowvec& FPR;
uword P;
uword N;
PRCalculate(urowvec& classes, vec& scores, vec& thresholds,
uvec& posLocVec, uvec& negLocVec, rowvec& TPR,
rowvec& FPR, uword P, uword N): classes(classes), scores(scores),
thresholds(thresholds), posLocVec(posLocVec),
negLocVec(negLocVec), TPR(TPR), FPR(FPR), P(P), N(N) {}
void operator()(const blocked_range<uword>& range) const {
for (uword i = range.begin(); i != range.end(); i++)
{
urowvec tmp = classes == (scores.t() >= thresholds(i));
TPR(i) = sum(tmp.elem(posLocVec)) / (double) P;
FPR(i) = 1 - sum(tmp.elem(negLocVec)) / (double) N;
}
}
};
void aucfun(urowvec& classes, vec& scores, Ptr_aucResult ptr_aucResult, bool hyperThread)
{
uword m = classes.n_elem, P = sum(classes), N = m - P;
vec thresholds(m+1);
thresholds.tail(m) = sort(scores, "descend");
thresholds(0) = thresholds(1);
ptr_aucResult->TPR = zeros<rowvec>(m+1);
ptr_aucResult->FPR = zeros<rowvec>(m+1);
uvec posLocVec = find(classes), negLocVec = find(1-classes);
int num_threads_now = hyperThread ? 2 : 1;
mkl_set_num_threads(num_threads_now);
PRCalculate PR_calculate(classes, scores, thresholds, posLocVec,
negLocVec, ptr_aucResult->TPR, ptr_aucResult->FPR, P, N);
parallel_for(blocked_range<uword>(0, m + 1), PR_calculate);
mkl_set_num_threads(mkl_get_max_threads());
ptr_aucResult->AUC = 1 -
sum((ptr_aucResult->TPR.tail(m) - ptr_aucResult->TPR.head(m)) %
(ptr_aucResult->FPR.tail(m) + ptr_aucResult->FPR.head(m))) / 2.0;
}
Editor is loading...