Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/elmergrid/src/metis-5.1.0/GKlib/evaluate.c
3206 views
1
/*!
2
\file evaluate.c
3
\brief Various routines to evaluate classification performance
4
5
\author George
6
\date 9/23/2008
7
\version\verbatim $Id: evaluate.c 13328 2012-12-31 14:57:40Z karypis $ \endverbatim
8
*/
9
10
#include <GKlib.h>
11
12
/**********************************************************************
13
* This function computes the max accuracy score of a ranked list,
14
* given +1/-1 class list
15
**********************************************************************/
16
float ComputeAccuracy(int n, gk_fkv_t *list)
17
{
18
int i, P, N, TP, FN = 0;
19
float bAccuracy = 0.0;
20
float acc;
21
22
for (P=0, i=0;i<n;i++)
23
P += (list[i].val == 1? 1 : 0);
24
N = n - P;
25
26
TP = FN = 0;
27
28
for(i=0; i<n; i++){
29
if (list[i].val == 1)
30
TP++;
31
else
32
FN++;
33
34
acc = (TP + N - FN) * 100.0/ (P + N) ;
35
if (acc > bAccuracy)
36
bAccuracy = acc;
37
}
38
39
return bAccuracy;
40
}
41
42
43
/*****************************************************************************
44
* This function computes the ROC score of a ranked list, given a +1/-1 class
45
* list.
46
******************************************************************************/
47
float ComputeROCn(int n, int maxN, gk_fkv_t *list)
48
{
49
int i, P, TP, FP, TPprev, FPprev, AUC;
50
float prev;
51
52
FP = TP = FPprev = TPprev = AUC = 0;
53
prev = list[0].key -1;
54
55
for (P=0, i=0; i<n; i++)
56
P += (list[i].val == 1 ? 1 : 0);
57
58
for (i=0; i<n && FP < maxN; i++) {
59
if (list[i].key != prev) {
60
AUC += (TP+TPprev)*(FP-FPprev)/2;
61
prev = list[i].key;
62
FPprev = FP;
63
TPprev = TP;
64
}
65
if (list[i].val == 1)
66
TP++;
67
else {
68
FP++;
69
}
70
}
71
AUC += (TP+TPprev)*(FP-FPprev)/2;
72
73
return (TP*FP > 0 ? (float)(1.0*AUC/(P*FP)) : 0.0);
74
}
75
76
77
/*****************************************************************************
78
* This function computes the median rate of false positive for each positive
79
* instance.
80
******************************************************************************/
81
float ComputeMedianRFP(int n, gk_fkv_t *list)
82
{
83
int i, P, N, TP, FP;
84
85
P = N = 0;
86
for (i=0; i<n; i++) {
87
if (list[i].val == 1)
88
P++;
89
else
90
N++;
91
}
92
93
FP = TP = 0;
94
for (i=0; i<n && TP < (P+1)/2; i++) {
95
if (list[i].val == 1)
96
TP++;
97
else
98
FP++;
99
}
100
101
return 1.0*FP/N;
102
}
103
104
/*********************************************************
105
* Compute the mean
106
********************************************************/
107
float ComputeMean (int n, float *values)
108
{
109
int i;
110
float mean = 0.0;
111
112
for(i=0; i < n; i++)
113
mean += values[i];
114
115
return 1.0 * mean/ n;
116
}
117
118
/********************************************************
119
* Compute the standard deviation
120
********************************************************/
121
float ComputeStdDev(int n, float *values)
122
{
123
int i;
124
float mean = ComputeMean(n, values);
125
float stdDev = 0;
126
127
for(i=0;i<n;i++){
128
stdDev += (values[i] - mean)* (values[i] - mean);
129
}
130
131
return sqrt(1.0 * stdDev/n);
132
}
133
134