Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/02/10 19:10:35 (15 years ago)
Author:
gkronber
Message:

Improved code for analyzers for SVR and symbolic regression. #1009

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs

    r3710 r3892  
    3939  [Item("BestSymbolicRegressionSolutionAnalyzer", "An operator for analyzing the best solution of symbolic regression problems given in symbolic expression tree encoding.")]
    4040  [StorableClass]
    41   public sealed class BestSymbolicRegressionSolutionAnalyzer : SingleSuccessorOperator, ISymbolicRegressionAnalyzer {
     41  public sealed class BestSymbolicRegressionSolutionAnalyzer : RegressionSolutionAnalyzer, ISymbolicRegressionAnalyzer {
    4242    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
    4343    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
    44     private const string ProblemDataParameterName = "ProblemData";
    45     private const string QualityParameterName = "Quality";
    46     private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
    47     private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
     44    private const string BestSolutionInputvariableCountResultName = "Variables used by best solution";
    4845    private const string BestSolutionParameterName = "BestSolution";
    49     private const string BestSolutionQualityParameterName = "BestSolutionQuality";
    50     private const string ResultsParameterName = "Results";
    51     private const string BestSolutionResultName = "Best solution (on validiation set)";
    52     private const string BestSolutionInputvariableCountResultName = "Variables used by best solution";
    53     private const string BestSolutionTrainingRSquared = "Best solution R² (training)";
    54     private const string BestSolutionTestRSquared = "Best solution R² (test)";
    55     private const string BestSolutionTrainingMse = "Best solution mean squared error (training)";
    56     private const string BestSolutionTestMse = "Best solution mean squared error (test)";
    57     private const string BestSolutionTrainingRelativeError = "Best solution average relative error (training)";
    58     private const string BestSolutionTestRelativeError = "Best solution average relative error (test)";
    5946
     47    #region parameter properties
    6048    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
    6149      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
     
    6452      get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
    6553    }
    66     public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
    67       get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
    68     }
    69     public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
    70       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
    71     }
    72     public IValueLookupParameter<DoubleValue> UpperEstimationLimitParameter {
    73       get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperEstimationLimitParameterName]; }
    74     }
    75     public IValueLookupParameter<DoubleValue> LowerEstimationLimitParameter {
    76       get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerEstimationLimitParameterName]; }
    77     }
    7854    public ILookupParameter<SymbolicRegressionSolution> BestSolutionParameter {
    7955      get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters[BestSolutionParameterName]; }
    8056    }
    81     public ILookupParameter<DoubleValue> BestSolutionQualityParameter {
    82       get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionQualityParameterName]; }
     57    #endregion
     58    #region properties
     59    public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter {
     60      get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; }
    8361    }
    84     public ILookupParameter<ResultCollection> ResultsParameter {
    85       get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
     62    public ItemArray<SymbolicExpressionTree> SymbolicExpressionTree {
     63      get { return SymbolicExpressionTreeParameter.ActualValue; }
    8664    }
     65    #endregion
    8766
    8867    public BestSymbolicRegressionSolutionAnalyzer()
     
    9069      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
    9170      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees."));
    92       Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
    93       Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper estimation limit that was set for the evaluation of the symbolic expression trees."));
    94       Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower estimation limit that was set for the evaluation of the symbolic expression trees."));
    95       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The qualities of the symbolic regression trees which should be analyzed."));
    9671      Parameters.Add(new LookupParameter<SymbolicRegressionSolution>(BestSolutionParameterName, "The best symbolic regression solution."));
    97       Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionQualityParameterName, "The quality of the best symbolic regression solution."));
    98       Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
    9972    }
    10073
    101     public override IOperation Apply() {
    102       ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
    103       ResultCollection results = ResultsParameter.ActualValue;
    104       ISymbolicExpressionTreeInterpreter interpreter = SymbolicExpressionTreeInterpreterParameter.ActualValue;
    105       ItemArray<SymbolicExpressionTree> expressions = SymbolicExpressionTreeParameter.ActualValue;
    106       DataAnalysisProblemData problemData = ProblemDataParameter.ActualValue;
    107       DoubleValue upperEstimationLimit = UpperEstimationLimitParameter.ActualValue;
    108       DoubleValue lowerEstimationLimit = LowerEstimationLimitParameter.ActualValue;
     74    protected override DataAnalysisSolution UpdateBestSolution() {
     75      double upperEstimationLimit = UpperEstimationLimit != null ? UpperEstimationLimit.Value : double.PositiveInfinity;
     76      double lowerEstimationLimit = LowerEstimationLimit != null ? LowerEstimationLimit.Value : double.NegativeInfinity;
    10977
    110       int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
     78      int i = Quality.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
    11179
    112       SymbolicRegressionSolution solution = BestSolutionParameter.ActualValue;
    113       if (solution == null) {
    114         var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)interpreter.Clone(), expressions[i], GetInputVariables(expressions[i]));
    115         solution = new SymbolicRegressionSolution(problemData, model, lowerEstimationLimit.Value, upperEstimationLimit.Value);
     80      if (BestSolutionQualityParameter.ActualValue == null || BestSolutionQualityParameter.ActualValue.Value > Quality[i].Value) {
     81        var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(),
     82          SymbolicExpressionTree[i],
     83          GetInputVariables(SymbolicExpressionTree[i]));
     84        var solution = new SymbolicRegressionSolution(ProblemData, model, lowerEstimationLimit, upperEstimationLimit);
     85
    11686        BestSolutionParameter.ActualValue = solution;
    117         BestSolutionQualityParameter.ActualValue = qualities[i];
    118         results.Add(new Result(BestSolutionResultName, solution));
    119         results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(model.InputVariables.Count())));
    120         #region calculate R2,MSE,Rel Error
    121         double[] trainingValues = problemData.Dataset.GetVariableValues(
    122           problemData.TargetVariable.Value,
    123           problemData.TrainingSamplesStart.Value,
    124           problemData.TrainingSamplesEnd.Value);
    125         double[] testValues = problemData.Dataset.GetVariableValues(
    126           problemData.TargetVariable.Value,
    127           problemData.TestSamplesStart.Value,
    128           problemData.TestSamplesEnd.Value);
    129         double trainingR2 = SimpleRSquaredEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
    130         double testR2 = SimpleRSquaredEvaluator.Calculate(testValues, solution.EstimatedTestValues);
    131         double trainingMse = SimpleMSEEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
    132         double testMse = SimpleMSEEvaluator.Calculate(testValues, solution.EstimatedTestValues);
    133         double trainingRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
    134         double testRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(testValues, solution.EstimatedTestValues);
    135         results.Add(new Result(BestSolutionTrainingRSquared, new DoubleValue(trainingR2)));
    136         results.Add(new Result(BestSolutionTestRSquared, new DoubleValue(testR2)));
    137         results.Add(new Result(BestSolutionTrainingMse, new DoubleValue(trainingMse)));
    138         results.Add(new Result(BestSolutionTestMse, new DoubleValue(testMse)));
    139         results.Add(new Result(BestSolutionTrainingRelativeError, new DoubleValue(trainingRelError)));
    140         results.Add(new Result(BestSolutionTestRelativeError, new DoubleValue(testRelError)));
    141         #endregion
    142       } else {
    143         if (BestSolutionQualityParameter.ActualValue.Value > qualities[i].Value) {
    144           var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)interpreter.Clone(), expressions[i], GetInputVariables(expressions[i]));
    145           solution = new SymbolicRegressionSolution(problemData, model, lowerEstimationLimit.Value, upperEstimationLimit.Value);
    146           BestSolutionParameter.ActualValue = solution;
    147           BestSolutionQualityParameter.ActualValue = qualities[i];
    148           results[BestSolutionResultName].Value = solution;
    149           results[BestSolutionInputvariableCountResultName].Value = new IntValue(model.InputVariables.Count());
    150           #region update R2,MSE, Rel Error
    151           double[] trainingValues = problemData.Dataset.GetVariableValues(
    152             problemData.TargetVariable.Value,
    153             problemData.TrainingSamplesStart.Value,
    154             problemData.TrainingSamplesEnd.Value);
    155           double[] testValues = problemData.Dataset.GetVariableValues(
    156             problemData.TargetVariable.Value,
    157             problemData.TestSamplesStart.Value,
    158             problemData.TestSamplesEnd.Value);
    159           double trainingR2 = SimpleRSquaredEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
    160           double testR2 = SimpleRSquaredEvaluator.Calculate(testValues, solution.EstimatedTestValues);
    161           double trainingMse = SimpleMSEEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
    162           double testMse = SimpleMSEEvaluator.Calculate(testValues, solution.EstimatedTestValues);
    163           double trainingRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(trainingValues, solution.EstimatedTrainingValues);
    164           double testRelError = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(testValues, solution.EstimatedTestValues);
    165           results[BestSolutionTrainingRSquared].Value = new DoubleValue(trainingR2);
    166           results[BestSolutionTestRSquared].Value = new DoubleValue(testR2);
    167           results[BestSolutionTrainingMse].Value = new DoubleValue(trainingMse);
    168           results[BestSolutionTestMse].Value = new DoubleValue(testMse);
    169           results[BestSolutionTrainingRelativeError].Value = new DoubleValue(trainingRelError);
    170           results[BestSolutionTestRelativeError].Value = new DoubleValue(testRelError);
    171           #endregion
     87        BestSolutionQualityParameter.ActualValue = Quality[i];
     88
     89        if (Results.ContainsKey(BestSolutionInputvariableCountResultName)) {
     90          Results[BestSolutionInputvariableCountResultName].Value = new IntValue(model.InputVariables.Count());
     91        } else {
     92          Results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(model.InputVariables.Count())));
    17293        }
    17394      }
    174 
    175       return base.Apply();
     95      return BestSolutionParameter.ActualValue;
    17696    }
    17797
Note: See TracChangeset for help on using the changeset viewer.