
double AUC(vector<pair<int,double> > &a){
sort(a.begin(),a.end(),cmp); //注意是降序
int len=a.size(),PosNum=0,NegNum=0; //统计正负样本个数
for(int i=0;i<len;i++){
if(a[i].first)
PosNum++;
else
NegNum++;
}
double auc=0;
int TP=0,FP=0,TPnext=0,FPnext=0;
for(int i=0;i<len;i++){ //阈值变小,每次增加一个判为正的样本
if(a[i].first)
TPnext++;
else
FPnext++;
//梯形面积,横坐标FP/NegNum,纵坐标FP/PosNum
auc+=((double)((TPnext+TP)*(FPnext-FP)))/(2*PosNum*NegNum);
TP=TPnext;
FP=FPnext;
}
return auc;
}
时间复杂度:排序O(nlogn),计算面积O(n)
调用之:
#include<iostream>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
bool cmp(pair<int,double> x, pair<int,double> y){
return x.second>y.second;
}
int main(){
vector<pair<int,double> > a; // >空格>,否则会与>>混淆而判错
a.push_back(make_pair(1,0.9));
a.push_back(make_pair(1,0.7));
a.push_back(make_pair(0,0.6));
a.push_back(make_pair(1,0.5));
a.push_back(make_pair(0,0.3));
a.push_back(make_pair(0,0.1));
cout<<AUC(a); //输出为0.89
return 0;
}
网友评论