聚类算法效果评估2,计算Precison,Recall,Fvalue,RI

#!/usr/bin/python
import sys;
import re;
def getPrecision(TP,TN,FP,FN):
    result=0.0;
    result=TP/(TP+FP);
    return result;
def getRecall(TP,TN,FP,FN):
    result=0.0;
    result=TP/(TP+FN);
    return result;
def getFvalue(TP,TN,FP,FN):
    result=0.0;
    p=getPrecision(TP,TN,FP,FN);
    r=getRecall(TP,TN,FP,FN);
    result=2*p*r/(p+r);
    return result;
def getRI(TP,TN,FP,FN):
    result=0.0;
    result=(TP+TN)/(TP+FP+FN+TN);
    return result;
if(__name__=="__main__"):
    filename=str(sys.argv[1]);
    TP=0.0;
    FP=0.0;
    TN=0.0;
    FN=0.0;
    preturn=re.compile('(^\s+|\s+$)');
    doccollection=[];
    fidsrc=file(filename,'r');
    for line in fidsrc.readlines():
        line=preturn.sub('',line);
        m=line.split('\t');
        if(len(m)==3):
            doccollection.append((int(m[0]),int(m[1]),int(m[2])));
    fidsrc.close();
    for i in range(0,len(doccollection)-1):
        for j in range(i+1,len(doccollection)):
            elem1=doccollection[i];
            elem2=doccollection[j];
            if(elem1[2]==elem2[2] and elem1[1]==elem2[1]):
                TP=TP+1;
            if(elem1[2]==elem2[2] and elem1[1]!=elem2[1]):
                FN=FN+1;
            if(elem1[2]!=elem2[2] and elem1[1]==elem2[1]):
                FP=FP+1;
            if(elem1[2]!=elem2[2] and elem1[1]!=elem2[1]):
                TN=TN+1;
    p=getPrecision(TP,TN,FP,FN);
    r=getRecall(TP,TN,FP,FN);
    f=getFvalue(TP,TN,FP,FN);
    ri=getRI(TP,TN,FP,FN);
    print 'TP=%f,TN=%f,FP=%f,FN=%f'%(TP,TN,FP,FN);
    print 'precision=%f,recall=%f,fvalue=%f,RI=%f'%(p,r,f,ri);  
原文地址:https://www.cnblogs.com/finallyliuyu/p/2361743.html