[5500]  1  #region License Information


 2  /* HeuristicLab


[17180]  3  * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)


[5500]  4  *


 5  * This file is part of HeuristicLab.


 6  *


 7  * HeuristicLab is free software: you can redistribute it and/or modify


 8  * it under the terms of the GNU General Public License as published by


 9  * the Free Software Foundation, either version 3 of the License, or


 10  * (at your option) any later version.


 11  *


 12  * HeuristicLab is distributed in the hope that it will be useful,


 13  * but WITHOUT ANY WARRANTY; without even the implied warranty of


 14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


 15  * GNU General Public License for more details.


 16  *


 17  * You should have received a copy of the GNU General Public License


 18  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


 19  */


 20  #endregion


 21 


 22  using System.Collections.Generic;


 23  using HeuristicLab.Common;


 24  using HeuristicLab.Core;


 25  using HeuristicLab.Data;


 26  using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;


[16565]  27  using HEAL.Attic;


[5500]  28 


[5501]  29  namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {


[5618]  30  [Item("Pearson R² Evaluator", "Calculates the square of the pearson correlation coefficient (also known as coefficient of determination) of a symbolic regression solution.")]


[16565]  31  [StorableType("6FAEC6C2C747452AA60D29AE37898A90")]


[5500]  32  public class SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator : SymbolicRegressionSingleObjectiveEvaluator {


 33  [StorableConstructor]


[16565]  34  protected SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator(StorableConstructorFlag _) : base(_) { }


[5500]  35  protected SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator(SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator original, Cloner cloner)


 36  : base(original, cloner) {


 37  }


 38  public override IDeepCloneable Clone(Cloner cloner) {


 39  return new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator(this, cloner);


 40  }


 41 


[5505]  42  public SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator() : base() { }


 43 


[5514]  44  public override bool Maximization { get { return true; } }


 45 


[10291]  46  public override IOperation InstrumentedApply() {


[5851]  47  var solution = SymbolicExpressionTreeParameter.ActualValue;


[5500]  48  IEnumerable<int> rows = GenerateRowsToEvaluate();


[5851]  49 


[12977]  50  double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value);


[5851]  51  QualityParameter.ActualValue = new DoubleValue(quality);


 52 


[10291]  53  return base.InstrumentedApply();


[5500]  54  }


 55 


[8664]  56  public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) {


[5500]  57  IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows);


[8664]  58  IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);


[5942]  59  OnlineCalculatorError errorState;


[8664]  60 


[12641]  61  double r;


[8664]  62  if (applyLinearScaling) {


[12641]  63  var rCalculator = new OnlinePearsonsRCalculator();


 64  CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, rCalculator, problemData.Dataset.Rows);


 65  errorState = rCalculator.ErrorState;


 66  r = rCalculator.R;


[8664]  67  } else {


 68  IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);


[12641]  69  r = OnlinePearsonsRCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState);


[8664]  70  }


 71  if (errorState != OnlineCalculatorError.None) return double.NaN;


[14354]  72  return r*r;


[5500]  73  }


[5613]  74 


 75  public override double Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows) {


[5722]  76  SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context;


[5770]  77  EstimationLimitsParameter.ExecutionContext = context;


[8664]  78  ApplyLinearScalingParameter.ExecutionContext = context;


[5722]  79 


[8664]  80  double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value);


[5722]  81 


 82  SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null;


[5770]  83  EstimationLimitsParameter.ExecutionContext = null;


[8664]  84  ApplyLinearScalingParameter.ExecutionContext = null;


[5722]  85 


 86  return r2;


[5613]  87  }


[18095]  88 


 89  public override double Evaluate(IRegressionProblemData problemData,


 90  ISymbolicExpressionTree solution,


 91  ISymbolicDataAnalysisExpressionTreeInterpreter interpreter,


 92  IEnumerable<int> rows = null,


 93  bool applyLinearScaling = true,


 94  double lowerEstimationLimit = double.MinValue,


 95  double upperEstimationLimit = double.MaxValue) {


 96  return Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, problemData, rows ?? problemData.TrainingIndices, applyLinearScaling);


 97  }


[5500]  98  }


 99  }

