Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 2321 was 2136, checked in by gkronber, 15 years ago

Improved handling of exceptional cases in data-based modeling evaluators. #688 (SimpleEvaluators should handle exceptional cases more gracefully)

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, 0];
33        double target = values[i, 1];
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, 1];
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.