Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Modeling/3.2/SimpleR2Evaluator.cs @ 2396

Last change on this file since 2396 was 2357, checked in by gkronber, 15 years ago

Fixed #740 (SimpleEvaluators in HL.GP.StructId and HL.SVM are not compatible with evaluators in HL.Modeling).

File size: 1.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using HeuristicLab.Core;
6using HeuristicLab.Data;
7using HeuristicLab.DataAnalysis;
8
9namespace HeuristicLab.Modeling {
10  public class SimpleR2Evaluator : SimpleEvaluatorBase {
11
12    public override string OutputVariableName {
13      get {
14        return "R2";
15      }
16    }
17
18    public override double Evaluate(double[,] values) {
19      try {
20        return Calculate(values);
21      }
22      catch (ArgumentException) {
23        return double.NegativeInfinity;
24      }
25    }
26
27    public static double Calculate(double[,] values) {
28      double targetMean = 0;
29      double sse = 0;
30      double cnt = 0;
31      for (int i = 0; i < values.GetLength(0); i++) {
32        double estimated = values[i, ESTIMATION_INDEX];
33        double target = values[i, ORIGINAL_INDEX];
34        if (!double.IsNaN(estimated) && !double.IsInfinity(estimated) &&
35            !double.IsNaN(target) && !double.IsInfinity(target)) {
36          targetMean += target;
37          double error = estimated - target;
38          sse += error * error;
39          cnt++;
40        }
41      }
42
43      if (cnt > 0) {
44        targetMean /= cnt;
45
46        double targetDeviationTotalSumOfSquares = 0;
47        for (int i = 0; i < values.GetLength(0); i++) {
48          double target = values[i, ORIGINAL_INDEX];
49          if (!double.IsNaN(target) && !double.IsInfinity(target)) {
50            target = target - targetMean;
51            target = target * target;
52            targetDeviationTotalSumOfSquares += target;
53          }
54        }
55        double quality = 1 - sse / targetDeviationTotalSumOfSquares;
56        if (quality > 1)
57          throw new InvalidProgramException();
58
59        return quality;
60      } else {
61        throw new ArgumentException("Coefficient of determination is not defined for input vectors of NaN or Inf");
62      }
63    }
64  }
65}
Note: See TracBrowser for help on using the repository browser.