Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 2657 was 2428, checked in by gkronber, 15 years ago

Implemented #782 (Additional model quality metrics: Pearson product-moment correlation coefficient and Spearman's rank correlation coefficient)

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            double targetDiff = target - targetMean;
51            targetDeviationTotalSumOfSquares += targetDiff * targetDiff;
52          }
53        }
54        double quality = 1 - sse / targetDeviationTotalSumOfSquares;
55        if (quality > 1)
56          throw new InvalidProgramException();
57
58        return quality;
59      } else {
60        throw new ArgumentException("Coefficient of determination is not defined for input vectors of NaN or Inf");
61      }
62    }
63  }
64}
Note: See TracBrowser for help on using the repository browser.