Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/30/12 10:21:21 (13 years ago)
Author:
mkommend
Message:

#1788: Prepared symbolic regression evaluators to apply linear scaling and moved to separate folder.

Location:
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators
Files:
1 added
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs

    r7670 r7672  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
     24using System.Linq;
    2325using HeuristicLab.Common;
    2426using HeuristicLab.Core;
     
    3133  [StorableClass]
    3234  public class SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator : SymbolicRegressionSingleObjectiveEvaluator {
     35    public override bool Maximization { get { return false; } }
     36    [ThreadStatic]
     37    private static double[] estimatedValuesCache;
     38
    3339    [StorableConstructor]
    3440    protected SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
     
    3945      return new SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator(this, cloner);
    4046    }
    41 
    4247    public SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator() : base() { }
    43 
    44     public override bool Maximization { get { return false; } }
    4548
    4649    public override IOperation Apply() {
     
    4851      IEnumerable<int> rows = GenerateRowsToEvaluate();
    4952
    50       double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows);
     53      double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScaling);
    5154      QualityParameter.ActualValue = new DoubleValue(quality);
    5255
     
    5457    }
    5558
    56     public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows) {
     59    public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) {
    5760      IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows);
    5861      IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
    59       IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);
     62      IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);
    6063      OnlineCalculatorError errorState;
    61       double mse = OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimationValues, out errorState);
    62       if (errorState != OnlineCalculatorError.None) return double.NaN;
     64
     65      double mse;
     66      if (applyLinearScaling) {
     67        //int i = 0;
     68        //int rowCount = rows.Count();
     69        //if (estimatedValuesCache == null) estimatedValuesCache = new double[problemData.Dataset.Rows];
     70        //foreach (var value in boundedEstimatedValues) {
     71        //  estimatedValuesCache[i] = value;
     72        //  i++;
     73        //}
     74
     75        double alpha, beta;
     76        OnlineLinearScalingParameterCalculator.Calculate(boundedEstimatedValues, originalValues, out alpha, out beta, out errorState);
     77        mse = OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimatedValues.Select(value => value * beta + alpha), out errorState);
     78      } else
     79        mse = OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimatedValues, out errorState);
     80
     81      if (errorState != OnlineCalculatorError.None) return Double.NaN;
    6382      else return mse;
    6483    }
     
    6887      EstimationLimitsParameter.ExecutionContext = context;
    6988
    70       double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows);
    71 
     89      double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScaling);
    7290
    7391      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null;
Note: See TracChangeset for help on using the changeset viewer.