Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 2498 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
RevLine 
[1814]1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using HeuristicLab.Core;
6using HeuristicLab.Data;
7using HeuristicLab.DataAnalysis;
8
[1869]9namespace HeuristicLab.Modeling {
[1888]10  public class SimpleR2Evaluator : SimpleEvaluatorBase {
[1814]11
[1888]12    public override string OutputVariableName {
13      get {
14        return "R2";
15      }
[1814]16    }
17
[1888]18    public override double Evaluate(double[,] values) {
[2136]19      try {
20        return Calculate(values);
21      }
22      catch (ArgumentException) {
23        return double.NegativeInfinity;
24      }
[1888]25    }
[1814]26
[1888]27    public static double Calculate(double[,] values) {
[1814]28      double targetMean = 0;
29      double sse = 0;
30      double cnt = 0;
[1888]31      for (int i = 0; i < values.GetLength(0); i++) {
[2357]32        double estimated = values[i, ESTIMATION_INDEX];
33        double target = values[i, ORIGINAL_INDEX];
[1814]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
[2136]43      if (cnt > 0) {
44        targetMean /= cnt;
45
46        double targetDeviationTotalSumOfSquares = 0;
47        for (int i = 0; i < values.GetLength(0); i++) {
[2357]48          double target = values[i, ORIGINAL_INDEX];
[2136]49          if (!double.IsNaN(target) && !double.IsInfinity(target)) {
[2428]50            double targetDiff = target - targetMean;
51            targetDeviationTotalSumOfSquares += targetDiff * targetDiff;
[2136]52          }
[1814]53        }
[2136]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");
[1814]61      }
62    }
63  }
64}
Note: See TracBrowser for help on using the repository browser.