1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


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;


23  using System.Collections.Generic;


24  using System.Linq;


25  using System.Text;


26  using HeuristicLab.Core;


27  using HeuristicLab.Data;


28  using HeuristicLab.Operators;


29  using HeuristicLab.Functions;


30  using HeuristicLab.DataAnalysis;


31 


32  namespace HeuristicLab.StructureIdentification {


33  public class TheilInequalityCoefficientEvaluator : GPEvaluatorBase {


34  public override string Description {


35  get {


36  return @"Evaluates 'FunctionTree' for all samples of 'Dataset' and calculates


37  the 'Theil inequality coefficient (scale invariant)' of estimated values vs. real values of 'TargetVariable'.";


38  }


39  }


40 


41  public TheilInequalityCoefficientEvaluator()


42  : base() {


43  AddVariableInfo(new VariableInfo("Differential", "Wether to calculate the coefficient for the predicted change vs. original change or for the absolute prediction vs. original value", typeof(BoolData), VariableKind.In));


44  }


45 


46  public override double Evaluate(IScope scope, IFunctionTree functionTree, int targetVariable, Dataset dataset) {


47  int trainingStart = GetVariableValue<IntData>("TrainingSamplesStart", scope, true).Data;


48  int trainingEnd = GetVariableValue<IntData>("TrainingSamplesEnd", scope, true).Data;


49  bool difference = GetVariableValue<BoolData>("Differential", scope, true).Data;


50  double errorsSquaredSum = 0.0;


51  double estimatedSquaredSum = 0.0;


52  double originalSquaredSum = 0.0;


53  functionTree.PrepareEvaluation(dataset);


54  for(int sample = trainingStart; sample < trainingEnd; sample++) {


55  double prevValue = 0.0;


56  if(difference) prevValue = dataset.GetValue(sample  1, targetVariable);


57  double estimatedChange = functionTree.Evaluate(sample)  prevValue;


58  double originalChange = dataset.GetValue(sample, targetVariable)  prevValue;


59  if(!double.IsNaN(originalChange) && !double.IsInfinity(originalChange)) {


60  if(double.IsNaN(estimatedChange)  double.IsInfinity(estimatedChange))


61  estimatedChange = maximumPunishment;


62  else if(estimatedChange > maximumPunishment)


63  estimatedChange = maximumPunishment;


64  else if(estimatedChange < maximumPunishment)


65  estimatedChange =  maximumPunishment;


66 


67  double error = estimatedChange  originalChange;


68  errorsSquaredSum += error * error;


69  estimatedSquaredSum += estimatedChange * estimatedChange;


70  originalSquaredSum += originalChange * originalChange;


71  }


72  }


73  int nSamples = trainingEnd  trainingStart;


74  double quality = Math.Sqrt(errorsSquaredSum / nSamples) / (Math.Sqrt(estimatedSquaredSum/nSamples) + Math.Sqrt(originalSquaredSum/nSamples));


75  if(double.IsNaN(quality)  double.IsInfinity(quality))


76  quality = double.MaxValue;


77  return quality;


78  }


79  }


80  }

