Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
roc_curve.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file src/numeric/roc_curve.cc
11 /// @author Sam DeLuca
12 
13 //stl headers
14 #include <iostream>
15 
16 //unit headers
17 #include <numeric/roc_curve.hh>
18 
19 //utility headers
20 #include <utility/exit.hh>
21 
22 
23 //stl headers
24 #include <string>
25 #include <algorithm>
26 
27 namespace numeric {
28 
29 /// @details Auto-generated virtual destructor
31 
32 /// @details Auto-generated virtual destructor
34 
35 
37  bool predicted,
38  bool actual,
39  std::string const & tag,
40  platform::Real const & score
41 ) :
42  tag_(tag),
43  score_(score)
44 {
45  if ( predicted && actual ) {
47  } else if ( predicted && !actual ) {
49  } else if ( !predicted && !actual ) {
51  } else {
53  }
54 }
55 
57  RocStatus const & status,
58  std::string const & tag,
59  platform::Real const & score
60 ) :
61  status_(status),
62  tag_(tag),
63  score_(score)
64 {
65  //
66 }
67 
69 {
70  return status_;
71 }
72 
74 {
75  status_ = status;
76 }
77 
78 std::string RocPoint::tag() const
79 {
80  return tag_;
81 }
82 
83 void RocPoint::tag(std::string const & tag)
84 {
85  tag_ = tag;
86 }
87 
89 {
90  return score_;
91 }
92 
94 {
95  score_ = score;
96 }
97 
98 
99 bool RocPoint::operator <(RocPoint const & that) const
100 {
101  return this->score_ < that.score_;
102 }
103 
105  true_positive_count_(0),
106  false_positive_count_(0),
107  true_negative_count_(0),
108  false_negative_count_(0)
109 {
110 
111 }
112 
113 void RocCurve::insert_point(RocPoint const & roc_point)
114 {
115  RocStatus status(roc_point.status());
116  roc_point_vector_.push_back(roc_point);
117 
118  switch(status)
119  {
120  case true_positive :
122  break;
123  case false_positive :
125  break;
126  case true_negative :
128  break;
129  case false_negative :
131  break;
132  default :
133  utility_exit_with_message("invalid RocPoint status, I have no idea how this happened");
134  break;
135  }
136 
137 }
138 
139 void RocCurve::insert_point(bool predicted, bool actual, std::string const & tag, platform::Real const & score)
140 {
141  RocPoint new_point(predicted,actual,tag,score);
142  insert_point(new_point);
143 }
144 
146 {
147  roc_curve_.clear();
148 
149  platform::Real true_positives = 0.0;
150  platform::Real false_negatives = 0.0;
151 
152  platform::Real false_positives = 0.0;
153  platform::Real true_negatives = 0.0;
154 
155 
156  //push an initial 0,0 point into the array
157  roc_curve_.push_back(std::make_pair(0.0,0.0));
158 
159  std::sort(roc_point_vector_.begin(),roc_point_vector_.end());
160 
161  for ( utility::vector1<RocPoint>::iterator roc_it= roc_point_vector_.begin(); roc_it != roc_point_vector_.end(); ++roc_it ) {
162  RocStatus status(roc_it->status());
163  switch(status)
164  {
165  case true_positive :
166  ++true_positives;
167  break;
168  case false_positive :
169  ++false_positives;
170  break;
171  case true_negative :
172  ++true_negatives;
173  break;
174  case false_negative :
175  ++false_negatives;
176  break;
177  default :
178  utility_exit_with_message("invalid RocPoint status, I have no idea how this happened");
179  }
180 
181  platform::Real true_positive_rate = 0.0;
182  platform::Real false_positive_rate = 0.0;
184  true_positive_rate = true_positives / (true_positive_count_+ false_negative_count_);
185  }
186 
188  false_positive_rate = false_positives / (false_positive_count_ + true_negative_count_);
189  }
190 
191  roc_curve_.push_back(std::make_pair(true_positive_rate,false_positive_rate));
192  }
193 
194  roc_curve_.push_back(std::make_pair(1.0,1.0));
195 }
196 
198 {
199  return roc_curve_;
200 }
201 
203 {
204  for ( utility::vector1<std::pair<platform::Real, platform::Real> >::iterator auc_it = roc_curve_.begin(); auc_it != roc_curve_.end(); ++auc_it ) {
205  std::cout << auc_it->first << " " <<auc_it->second <<std::endl;
206  }
207 }
208 
210 {
211  platform::Real AUC = 0.0;
212  platform::Real last_TPR = 0.0;
213  platform::Real last_FPR = 0.0;
214  for ( utility::vector1<std::pair<platform::Real, platform::Real> >::iterator auc_it = roc_curve_.begin(); auc_it != roc_curve_.end(); ++auc_it ) {
215 
216  platform::Real TPR = auc_it->first;
217  platform::Real FPR = auc_it->second;
218  AUC += (FPR-last_FPR)*((TPR+last_TPR)/2);
219  //AUC += auc_it->first*(auc_it->second - last_FPR);
220  last_TPR = TPR;
221  last_FPR = FPR;
222 
223  }
224 
225  return AUC;
226 }
227 
228 }
229 
230 
platform::Size true_positive_count_
Definition: roc_curve.hh:75
platform::Real score() const
Definition: roc_curve.cc:88
bool operator<(RocPoint const &that) const
Definition: roc_curve.cc:99
#define utility_exit_with_message(m)
Exit with file + line + message.
Definition: exit.hh:47
RocStatus status() const
Definition: roc_curve.cc:68
virtual ~RocPoint()
Automatically generated virtual destructor for class deriving directly from ReferenceCount.
Definition: roc_curve.cc:33
def status
utility::vector1< std::pair< platform::Real, platform::Real > > roc_curve()
Definition: roc_curve.cc:197
platform::Size false_positive_count_
Definition: roc_curve.hh:76
RocStatus status_
Definition: roc_curve.hh:52
platform::Real score_
Definition: roc_curve.hh:54
platform::Size true_negative_count_
Definition: roc_curve.hh:77
Program exit functions and macros.
std::vector with 1-based indexing
Definition: vector1.fwd.hh:44
super::iterator iterator
Definition: vector1.hh:61
void insert_point(RocPoint const &roc_point)
Definition: roc_curve.cc:113
utility::vector1< RocPoint > roc_point_vector_
Definition: roc_curve.hh:80
virtual ~RocCurve()
Automatically generated virtual destructor for class deriving directly from ReferenceCount.
Definition: roc_curve.cc:30
RocPoint(bool predicted, bool actual, std::string const &tag, platform::Real const &score)
Definition: roc_curve.cc:36
void generate_roc_curve()
Definition: roc_curve.cc:145
std::string tag() const
Definition: roc_curve.cc:78
ocstream cout(std::cout)
Wrapper around std::cout.
Definition: ocstream.hh:287
utility::vector1< std::pair< platform::Real, platform::Real > > roc_curve_
Definition: roc_curve.hh:81
platform::Size false_negative_count_
Definition: roc_curve.hh:78
void print_roc_curve()
Definition: roc_curve.cc:202
std::string tag_
Definition: roc_curve.hh:53
platform::Real calculate_auc()
Definition: roc_curve.cc:209
rule< Scanner, tag_closure::context_t > tag
Definition: Tag.cc:373