美文网首页
AUC的计算

AUC的计算

作者: LxxxR | 来源:发表于2018-05-23 11:48 被阅读0次
image.png
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;
}

相关文章

网友评论

      本文标题:AUC的计算

      本文链接:https://www.haomeiwen.com/subject/bgcrjftx.html