yat/statistics/AUC.cc

Code
Comments
Other
Rev Date Author Line
69 29 Apr 04 peter 1 // $Id$
69 29 Apr 04 peter 2
675 10 Oct 06 jari 3 /*
831 27 Mar 07 peter 4   Copyright (C) 2004, 2005 Peter Johansson
4359 23 Aug 23 peter 5   Copyright (C) 2006 Jari Häkkinen, Peter Johansson
4359 23 Aug 23 peter 6   Copyright (C) 2007 Peter Johansson
4359 23 Aug 23 peter 7   Copyright (C) 2008 Jari Häkkinen, Peter Johansson
4359 23 Aug 23 peter 8   Copyright (C) 2011, 2012 Peter Johansson
295 29 Apr 05 peter 9
1437 25 Aug 08 peter 10   This file is part of the yat library, http://dev.thep.lu.se/yat
623 05 Sep 06 peter 11
675 10 Oct 06 jari 12   The yat library is free software; you can redistribute it and/or
675 10 Oct 06 jari 13   modify it under the terms of the GNU General Public License as
1486 09 Sep 08 jari 14   published by the Free Software Foundation; either version 3 of the
675 10 Oct 06 jari 15   License, or (at your option) any later version.
675 10 Oct 06 jari 16
675 10 Oct 06 jari 17   The yat library is distributed in the hope that it will be useful,
675 10 Oct 06 jari 18   but WITHOUT ANY WARRANTY; without even the implied warranty of
675 10 Oct 06 jari 19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
675 10 Oct 06 jari 20   General Public License for more details.
675 10 Oct 06 jari 21
675 10 Oct 06 jari 22   You should have received a copy of the GNU General Public License
1487 10 Sep 08 jari 23   along with yat. If not, see <http://www.gnu.org/licenses/>.
675 10 Oct 06 jari 24 */
675 10 Oct 06 jari 25
2881 18 Nov 12 peter 26 #include <config.h>
2881 18 Nov 12 peter 27
2551 12 Aug 11 peter 28 #include <iostream>
2551 12 Aug 11 peter 29
820 17 Mar 07 peter 30 #include "AUC.h"
675 10 Oct 06 jari 31 #include "yat/classifier/DataLookupWeighted1D.h"
747 11 Feb 07 peter 32 #include "yat/classifier/Target.h"
675 10 Oct 06 jari 33 #include "yat/utility/stl_utility.h"
1023 01 Feb 08 peter 34 #include "yat/utility/VectorBase.h"
675 10 Oct 06 jari 35
779 05 Mar 07 peter 36 #include <cassert>
140 20 Aug 04 peter 37 #include <cmath>
112 07 Jul 04 peter 38 #include <utility>
779 05 Mar 07 peter 39 #include <map>
69 29 Apr 04 peter 40
69 29 Apr 04 peter 41 namespace theplu {
680 11 Oct 06 jari 42 namespace yat {
4200 19 Aug 22 peter 43 namespace statistics {
69 29 Apr 04 peter 44
820 17 Mar 07 peter 45   AUC::AUC(bool absolute)
779 05 Mar 07 peter 46     :  Score(absolute)
779 05 Mar 07 peter 47   {
779 05 Mar 07 peter 48   }
779 05 Mar 07 peter 49
4200 19 Aug 22 peter 50   double AUC::score(const classifier::Target& target,
1023 01 Feb 08 peter 51                     const utility::VectorBase& value) const
69 29 Apr 04 peter 52   {
509 18 Feb 06 peter 53     assert(target.size()==value.size());
779 05 Mar 07 peter 54     // key data, pair<target, weight>
779 05 Mar 07 peter 55     std::multimap<double, std::pair<bool, double> > m;
779 05 Mar 07 peter 56     for (unsigned int i=0; i<target.size(); i++)
4200 19 Aug 22 peter 57       m.insert(std::make_pair(value(i),
779 05 Mar 07 peter 58                               std::make_pair(target.binary(i),1.0)));
4200 19 Aug 22 peter 59
779 05 Mar 07 peter 60     return score(m);
779 05 Mar 07 peter 61   }
475 22 Dec 05 peter 62
509 18 Feb 06 peter 63
136 16 Aug 04 peter 64
4200 19 Aug 22 peter 65   double AUC::score(const classifier::Target& target,
820 17 Mar 07 peter 66                     const classifier::DataLookupWeighted1D& value) const
623 05 Sep 06 peter 67   {
779 05 Mar 07 peter 68     assert(target.size()==value.size());
779 05 Mar 07 peter 69     // key data, pair<target, weight>
779 05 Mar 07 peter 70     std::multimap<double, std::pair<bool, double> > m;
623 05 Sep 06 peter 71     for (unsigned int i=0; i<target.size(); i++)
623 05 Sep 06 peter 72       if (value.weight(i))
4200 19 Aug 22 peter 73         m.insert(std::make_pair(value.data(i),
4200 19 Aug 22 peter 74                                 std::make_pair(target.binary(i),
779 05 Mar 07 peter 75                                                value.weight(i))));
4200 19 Aug 22 peter 76
779 05 Mar 07 peter 77     return score(m);
623 05 Sep 06 peter 78   }
623 05 Sep 06 peter 79
623 05 Sep 06 peter 80
4200 19 Aug 22 peter 81   double AUC::score(const classifier::Target& target,
4200 19 Aug 22 peter 82                     const utility::VectorBase& value,
1023 01 Feb 08 peter 83                     const utility::VectorBase& weight) const
103 15 Jun 04 peter 84   {
779 05 Mar 07 peter 85     assert(target.size()==value.size());
779 05 Mar 07 peter 86     assert(target.size()==weight.size());
779 05 Mar 07 peter 87     // key data, pair<target, weight>
779 05 Mar 07 peter 88     std::multimap<double, std::pair<bool, double> > m;
475 22 Dec 05 peter 89     for (unsigned int i=0; i<target.size(); i++)
488 04 Jan 06 peter 90       if (weight(i))
4200 19 Aug 22 peter 91         m.insert(std::make_pair(value(i),
779 05 Mar 07 peter 92                                 std::make_pair(target.binary(i), weight(i))));
4200 19 Aug 22 peter 93
779 05 Mar 07 peter 94     return score(m);
779 05 Mar 07 peter 95   }
488 04 Jan 06 peter 96
475 22 Dec 05 peter 97
820 17 Mar 07 peter 98   double AUC::score(const MultiMap& m) const
779 05 Mar 07 peter 99   {
778 04 Mar 07 peter 100     double area=0;
779 05 Mar 07 peter 101     double cumsum_pos_w=0;
779 05 Mar 07 peter 102     double cumsum_neg_w=0;
779 05 Mar 07 peter 103     typedef MultiMap::const_iterator iter;
475 22 Dec 05 peter 104
2551 12 Aug 11 peter 105     iter first = m.begin();
2551 12 Aug 11 peter 106     while (first!=m.end()) {
2551 12 Aug 11 peter 107       double local_cumsum_pos_w=0;
2551 12 Aug 11 peter 108       double local_cumsum_neg_w=0;
2551 12 Aug 11 peter 109       iter last = first;
2551 12 Aug 11 peter 110       while (last!=m.end() && first->first==last->first) {
2551 12 Aug 11 peter 111         if (last->second.first)
2551 12 Aug 11 peter 112           local_cumsum_pos_w += last->second.second;
2551 12 Aug 11 peter 113         else
2551 12 Aug 11 peter 114           local_cumsum_neg_w += last->second.second;
2551 12 Aug 11 peter 115         ++last;
4200 19 Aug 22 peter 116       }
2551 12 Aug 11 peter 117       area += local_cumsum_pos_w * ( cumsum_neg_w + 0.5*local_cumsum_neg_w );
2551 12 Aug 11 peter 118       cumsum_pos_w += local_cumsum_pos_w;
2551 12 Aug 11 peter 119       cumsum_neg_w += local_cumsum_neg_w;
2551 12 Aug 11 peter 120       first = last;
998 13 Dec 07 peter 121     }
779 05 Mar 07 peter 122     // max area is cumsum_neg_w * cumsum_pos_w
779 05 Mar 07 peter 123     area/=(cumsum_neg_w*cumsum_pos_w);
4200 19 Aug 22 peter 124
778 04 Mar 07 peter 125     if (area<0.5 && absolute_)
778 04 Mar 07 peter 126       return 1.0-area;
778 04 Mar 07 peter 127     return area;
779 05 Mar 07 peter 128 }
103 15 Jun 04 peter 129
683 11 Oct 06 jari 130 }}} // of namespace statistics, yat, and theplu