Changeset 8664
- Timestamp:
- 09/17/12 11:18:40 (12 years ago)
- Location:
- trunk/sources
- Files:
-
- 43 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
r7259 r8664 65 65 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 66 66 EstimationLimitsParameter.ExecutionContext = context; 67 ApplyLinearScalingParameter.ExecutionContext = context; 67 68 68 69 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows); … … 70 71 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 71 72 EstimationLimitsParameter.ExecutionContext = null; 73 ApplyLinearScalingParameter.ExecutionContext = null; 72 74 73 75 return quality; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
r6740 r8664 26 26 IEnumerable<int> rows = GenerateRowsToEvaluate(); 27 27 var solution = SymbolicExpressionTreeParameter.ActualValue; 28 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );28 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 29 29 QualitiesParameter.ActualValue = new DoubleArray(qualities); 30 30 return base.Apply(); 31 31 } 32 32 33 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {33 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 34 34 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 35 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);35 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 36 36 OnlineCalculatorError errorState; 37 double r2 = OnlinePearsonsRSquaredCalculator.Calculate(estimatedValues, originalValues, out errorState); 38 if (errorState != OnlineCalculatorError.None) r2 = 0.0; 39 return new double[] { r2, solution.Length }; 37 38 double r2; 39 if (applyLinearScaling) { 40 var r2Calculator = new OnlinePearsonsRSquaredCalculator(); 41 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, r2Calculator, problemData.Dataset.Rows); 42 errorState = r2Calculator.ErrorState; 43 r2 = r2Calculator.RSquared; 44 } else { 45 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 46 r2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 47 } 48 49 if (errorState != OnlineCalculatorError.None) r2 = double.NaN; 50 return new double[2] { r2, solution.Length }; 40 51 41 52 } … … 45 56 EstimationLimitsParameter.ExecutionContext = context; 46 57 47 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );58 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 48 59 49 60 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveProblem.cs
r8594 r8664 68 68 Parameters.Add(new ValueParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "", new AccuracyMaximizingThresholdsModelCreator())); 69 69 70 ApplyLinearScalingParameter.Value.Value = false; 70 71 EstimationLimitsParameter.Hidden = true; 71 72 -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveTrainingBestSolutionAnalyzer.cs
r8594 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 39 38 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 40 39 private const string EstimationLimitsParameterName = "EstimationLimits"; 41 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";42 40 43 41 #region parameter properties … … 57 55 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 58 56 } 59 public IValueParameter<BoolValue> ApplyLinearScalingParameter {60 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }61 }62 #endregion63 64 #region properties65 public BoolValue ApplyLinearScaling {66 get { return ApplyLinearScalingParameter.Value; }67 }68 57 #endregion 69 58 … … 77 66 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 78 67 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic classification model.")); 79 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));80 68 } 81 69 public override IDeepCloneable Clone(Cloner cloner) { … … 91 79 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQuality) { 92 80 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 93 if (ApplyLinearScaling .Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue);81 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 94 82 95 83 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs
r8594 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 37 36 private const string ModelCreatorParameterName = "ModelCreator"; 38 37 private const string EstimationLimitsParameterName = "EstimationLimits"; 39 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";40 38 41 39 #region parameter properties 42 40 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { 43 41 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 44 }45 public IValueParameter<BoolValue> ApplyLinearScalingParameter {46 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }47 42 } 48 43 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { … … 54 49 #endregion 55 50 56 #region properties57 public BoolValue ApplyLinearScaling {58 get { return ApplyLinearScalingParameter.Value; }59 }60 #endregion61 51 [StorableConstructor] 62 52 private SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 65 55 : base() { 66 56 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The loewr and upper limit for the estimated values produced by the symbolic classification model.")); 67 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));68 57 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 69 58 } … … 72 61 } 73 62 74 [StorableHook(HookType.AfterDeserialization)]75 private void AfterDeserialization() {76 if (!Parameters.ContainsKey(ModelCreatorParameterName))77 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, ""));78 }79 63 80 64 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQualities) { 81 65 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 82 if (ApplyLinearScaling .Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue);66 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 83 67 84 68 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs
r7259 r8664 47 47 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 48 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 50 QualityParameter.ActualValue = new DoubleValue(quality); 51 51 return base.Apply(); 52 52 } 53 53 54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);57 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 OnlineCalculatorError errorState; 58 58 59 double minClassValue = problemData.ClassValues.OrderBy(x => x).First();60 double maxClassValue = problemData.ClassValues.OrderBy(x => x).Last();59 double lowestClassValue = problemData.ClassValues.OrderBy(x => x).First(); 60 double upmostClassValue = problemData.ClassValues.OrderByDescending(x => x).First(); 61 61 62 IEnumerator<double> originalEnumerator = originalValues.GetEnumerator(); 63 IEnumerator<double> estimatedEnumerator = estimatedValues.GetEnumerator(); 64 double errorSum = 0.0; 65 int n = 0; 66 67 // always move forward both enumerators (do not use short-circuit evaluation!) 68 while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) { 69 double estimated = estimatedEnumerator.Current; 70 double original = originalEnumerator.Current; 71 double error = estimated - original; 72 73 if (estimated < minClassValue || estimated > maxClassValue) 74 errorSum += Math.Abs(error); 75 else 76 errorSum += Math.Pow(error, 2); 77 n++; 62 double boundedMse; 63 if (applyLinearScaling) { 64 var boundedMseCalculator = new OnlineBoundedMeanSquaredErrorCalculator(lowestClassValue, upmostClassValue); 65 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, boundedMseCalculator, problemData.Dataset.Rows); 66 errorState = boundedMseCalculator.ErrorState; 67 boundedMse = boundedMseCalculator.BoundedMeanSquaredError; 68 } else { 69 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 70 boundedMse = OnlineBoundedMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, lowestClassValue, upmostClassValue, out errorState); 78 71 } 79 80 // check if both enumerators are at the end to make sure both enumerations have the same length 81 if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext()) { 82 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 83 } else { 84 return errorSum / n; 85 } 72 if (errorState != OnlineCalculatorError.None) return Double.NaN; 73 return boundedMse; 86 74 } 87 75 … … 89 77 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 90 78 EstimationLimitsParameter.ExecutionContext = context; 79 ApplyLinearScalingParameter.ExecutionContext = context; 91 80 92 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );81 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 93 82 94 83 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 95 84 EstimationLimitsParameter.ExecutionContext = null; 85 ApplyLinearScalingParameter.ExecutionContext = null; 96 86 97 87 return mse; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs
r7259 r8664 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 23 24 using HeuristicLab.Common; … … 47 48 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 49 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );50 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 51 QualityParameter.ActualValue = new DoubleValue(quality); 51 52 return base.Apply(); 52 53 } 53 54 54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {55 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 56 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 57 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 58 58 OnlineCalculatorError errorState; 59 double mse = OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimationValues, out errorState); 60 if (errorState != OnlineCalculatorError.None) return double.NaN; 61 else return mse; 59 60 double mse; 61 if (applyLinearScaling) { 62 var mseCalculator = new OnlineMeanSquaredErrorCalculator(); 63 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, mseCalculator, problemData.Dataset.Rows); 64 errorState = mseCalculator.ErrorState; 65 mse = mseCalculator.MeanSquaredError; 66 } else { 67 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 68 mse = OnlineMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 69 } 70 if (errorState != OnlineCalculatorError.None) return Double.NaN; 71 return mse; 62 72 } 63 73 … … 65 75 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 66 76 EstimationLimitsParameter.ExecutionContext = context; 77 ApplyLinearScalingParameter.ExecutionContext = context; 67 78 68 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );79 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 69 80 70 81 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 71 82 EstimationLimitsParameter.ExecutionContext = null; 83 ApplyLinearScalingParameter.ExecutionContext = null; 72 84 73 85 return mse; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePearsonRSquaredEvaluator.cs
r8646 r8664 47 47 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 48 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 50 QualityParameter.ActualValue = new DoubleValue(quality); 51 51 return base.Apply(); 52 52 } 53 53 54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 58 57 OnlineCalculatorError errorState; 59 double r2 = OnlinePearsonsRSquaredCalculator.Calculate(boundedEstimationValues, originalValues, out errorState); 60 if (errorState != OnlineCalculatorError.None) return 0.0; 61 else return r2; 58 59 double r2; 60 if (applyLinearScaling) { 61 var r2Calculator = new OnlinePearsonsRSquaredCalculator(); 62 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, r2Calculator, problemData.Dataset.Rows); 63 errorState = r2Calculator.ErrorState; 64 r2 = r2Calculator.RSquared; 65 } else { 66 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 67 r2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 68 } 69 if (errorState != OnlineCalculatorError.None) return double.NaN; 70 return r2; 62 71 } 63 72 … … 65 74 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 66 75 EstimationLimitsParameter.ExecutionContext = context; 76 ApplyLinearScalingParameter.ExecutionContext = context; 67 77 68 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );78 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 69 79 70 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 71 81 EstimationLimitsParameter.ExecutionContext = null; 82 ApplyLinearScalingParameter.ExecutionContext = null; 72 83 73 84 return r2; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs
r8594 r8664 86 86 EstimationLimitsParameter.ExecutionContext = context; 87 87 ModelCreatorParameter.ExecutionContext = context; 88 ApplyLinearScalingParameter.ExecutionContext = context; 88 89 89 90 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel(tree, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 91 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, problemData, problemData.TargetVariable); 90 92 model.RecalculateModelParameters(problemData, rows); 91 93 double penalty = Calculate(model, problemData, rows); … … 94 96 EstimationLimitsParameter.ExecutionContext = null; 95 97 ModelCreatorParameter.ExecutionContext = null; 98 ApplyLinearScalingParameter.ExecutionContext = null; 96 99 97 100 return penalty; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs
r8594 r8664 66 66 Parameters.Add(new ValueParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "", new AccuracyMaximizingThresholdsModelCreator())); 67 67 68 ApplyLinearScalingParameter.Value.Value = false; 68 69 EstimationLimitsParameter.Hidden = true; 69 70 -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer.cs
r8594 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 39 38 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 40 39 private const string EstimationLimitsParameterName = "UpperEstimationLimit"; 41 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";42 40 #region parameter properties 43 41 public ILookupParameter<IClassificationProblemData> ProblemDataParameter { … … 56 54 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 57 55 } 58 public IValueParameter<BoolValue> ApplyLinearScalingParameter {59 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }60 }61 56 #endregion 62 #region properties 63 public BoolValue ApplyLinearScaling { 64 get { return ApplyLinearScalingParameter.Value; } 65 } 66 #endregion 57 67 58 68 59 [StorableConstructor] … … 75 66 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 76 67 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic classification model.")); 77 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));78 68 } 79 69 … … 89 79 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 90 80 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 91 if (ApplyLinearScaling .Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue);81 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 92 82 93 83 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs
r8594 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 34 33 [StorableClass] 35 34 public sealed class SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveTrainingParetoBestSolutionAnalyzer<IClassificationProblemData, ISymbolicClassificationSolution>, ISymbolicClassificationModelCreatorOperator { 36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";37 35 private const string ModelCreatorParameterName = "ModelCreator"; 38 36 #region parameter properties 39 public IValueParameter<BoolValue> ApplyLinearScalingParameter {40 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }41 }42 37 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 43 38 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } … … 48 43 #endregion 49 44 50 #region properties51 public BoolValue ApplyLinearScaling {52 get { return ApplyLinearScalingParameter.Value; }53 }54 #endregion55 56 45 [StorableConstructor] 57 46 private SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 59 48 public SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer() 60 49 : base() { 61 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));62 50 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 63 51 } … … 74 62 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree) { 75 63 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 76 if (ApplyLinearScaling .Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue);64 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 77 65 78 66 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer.cs
r8594 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 36 35 ISymbolicDataAnalysisBoundedOperator, ISymbolicClassificationModelCreatorOperator { 37 36 private const string EstimationLimitsParameterName = "EstimationLimits"; 38 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";39 37 private const string ModelCreatorParameterName = "ModelCreator"; 40 38 … … 42 40 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { 43 41 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 44 }45 public IValueParameter<BoolValue> ApplyLinearScalingParameter {46 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }47 42 } 48 43 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { … … 54 49 #endregion 55 50 56 #region properties57 public BoolValue ApplyLinearScaling {58 get { return ApplyLinearScalingParameter.Value; }59 }60 #endregion61 51 [StorableConstructor] 62 52 private SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 65 55 : base() { 66 56 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic classification model.")); 67 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));68 57 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 69 58 } … … 80 69 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 81 70 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 82 if (ApplyLinearScaling .Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue);71 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 83 72 84 73 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer.cs
r8594 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 34 33 [StorableClass] 35 34 public sealed class SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveValidationParetoBestSolutionAnalyzer<ISymbolicClassificationSolution, ISymbolicClassificationSingleObjectiveEvaluator, IClassificationProblemData>, ISymbolicClassificationModelCreatorOperator { 36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";37 35 private const string ModelCreatorParameterName = "ModelCreator"; 38 36 #region parameter properties 39 public IValueParameter<BoolValue> ApplyLinearScalingParameter {40 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }41 }42 37 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 43 38 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } … … 48 43 #endregion 49 44 50 #region properties51 public BoolValue ApplyLinearScaling {52 get { return ApplyLinearScalingParameter.Value; }53 }54 #endregion55 56 45 [StorableConstructor] 57 46 private SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 59 48 public SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer() 60 49 : base() { 61 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));62 50 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 63 51 } … … 74 62 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree) { 75 63 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 76 if (ApplyLinearScaling .Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue);64 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 77 65 78 66 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs
r8623 r8664 62 62 return CreateClassificationSolution(problemData); 63 63 } 64 65 #region scaling66 public static void Scale(ISymbolicClassificationModel model, IClassificationProblemData problemData) {67 var dataset = problemData.Dataset;68 var targetVariable = problemData.TargetVariable;69 var rows = problemData.TrainingIndices;70 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, rows);71 var targetValues = dataset.GetDoubleValues(targetVariable, rows);72 double alpha;73 double beta;74 OnlineCalculatorError errorState;75 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out alpha, out beta, out errorState);76 if (errorState != OnlineCalculatorError.None) return;77 78 ConstantTreeNode alphaTreeNode = null;79 ConstantTreeNode betaTreeNode = null;80 // check if model has been scaled previously by analyzing the structure of the tree81 var startNode = model.SymbolicExpressionTree.Root.GetSubtree(0);82 if (startNode.GetSubtree(0).Symbol is Addition) {83 var addNode = startNode.GetSubtree(0);84 if (addNode.SubtreeCount == 2 && addNode.GetSubtree(0).Symbol is Multiplication && addNode.GetSubtree(1).Symbol is Constant) {85 alphaTreeNode = addNode.GetSubtree(1) as ConstantTreeNode;86 var mulNode = addNode.GetSubtree(0);87 if (mulNode.SubtreeCount == 2 && mulNode.GetSubtree(1).Symbol is Constant) {88 betaTreeNode = mulNode.GetSubtree(1) as ConstantTreeNode;89 }90 }91 }92 // if tree structure matches the structure necessary for linear scaling then reuse the existing tree nodes93 if (alphaTreeNode != null && betaTreeNode != null) {94 betaTreeNode.Value *= beta;95 alphaTreeNode.Value *= beta;96 alphaTreeNode.Value += alpha;97 } else {98 var mainBranch = startNode.GetSubtree(0);99 startNode.RemoveSubtree(0);100 var scaledMainBranch = MakeSum(MakeProduct(mainBranch, beta), alpha);101 startNode.AddSubtree(scaledMainBranch);102 }103 }104 105 private static ISymbolicExpressionTreeNode MakeSum(ISymbolicExpressionTreeNode treeNode, double alpha) {106 if (alpha.IsAlmost(0.0)) {107 return treeNode;108 } else {109 var addition = new Addition();110 var node = addition.CreateTreeNode();111 var alphaConst = MakeConstant(alpha);112 node.AddSubtree(treeNode);113 node.AddSubtree(alphaConst);114 return node;115 }116 }117 118 private static ISymbolicExpressionTreeNode MakeProduct(ISymbolicExpressionTreeNode treeNode, double beta) {119 if (beta.IsAlmost(1.0)) {120 return treeNode;121 } else {122 var multipliciation = new Multiplication();123 var node = multipliciation.CreateTreeNode();124 var betaConst = MakeConstant(beta);125 node.AddSubtree(treeNode);126 node.AddSubtree(betaConst);127 return node;128 }129 }130 131 private static ISymbolicExpressionTreeNode MakeConstant(double c) {132 var node = (ConstantTreeNode)(new Constant()).CreateTreeNode();133 node.Value = c;134 return node;135 }136 #endregion137 64 } 138 65 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/InteractiveSymbolicRegressionSolutionSimplifierView.cs
r8639 r8664 51 51 protected override void UpdateModel(ISymbolicExpressionTree tree) { 52 52 var model = new SymbolicRegressionModel(tree, Content.Model.Interpreter, Content.Model.LowerEstimationLimit, Content.Model.UpperEstimationLimit); 53 SymbolicRegressionModel.Scale(model, Content.ProblemData );53 SymbolicRegressionModel.Scale(model, Content.ProblemData, Content.ProblemData.TargetVariable); 54 54 Content.Model = model; 55 55 } … … 122 122 123 123 protected override void btnOptimizeConstants_Click(object sender, EventArgs e) { 124 SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(Content.Model.Interpreter, Content.Model.SymbolicExpressionTree, Content.ProblemData, Content.ProblemData.TrainingIndices, 0.001, 0, 0.0001); 124 var model = Content.Model; 125 SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(Content.Model.Interpreter, Content.Model.SymbolicExpressionTree, Content.ProblemData, Content.ProblemData.TrainingIndices, 126 applyLinearScaling: true, improvement: 0.001, iterations: 0, differentialStep: 0.0001, upperEstimationLimit: model.UpperEstimationLimit, lowerEstimationLimit: model.LowerEstimationLimit); 125 127 UpdateModel(Content.Model.SymbolicExpressionTree); 126 128 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
r7259 r8664 47 47 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 48 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );49 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 50 QualitiesParameter.ActualValue = new DoubleArray(qualities); 51 51 return base.Apply(); 52 52 } 53 53 54 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows ) {54 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 58 57 OnlineCalculatorError errorState; 59 double mse = OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimationValues, out errorState); 58 59 double mse; 60 if (applyLinearScaling) { 61 var mseCalculator = new OnlineMeanSquaredErrorCalculator(); 62 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, mseCalculator, problemData.Dataset.Rows); 63 errorState = mseCalculator.ErrorState; 64 mse = mseCalculator.MeanSquaredError; 65 } else { 66 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 67 mse = OnlineMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 68 } 60 69 if (errorState != OnlineCalculatorError.None) mse = double.NaN; 61 70 return new double[2] { mse, solution.Length }; … … 65 74 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 66 75 EstimationLimitsParameter.ExecutionContext = context; 76 ApplyLinearScalingParameter.ExecutionContext = context; 67 77 68 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );78 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 69 79 70 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 71 81 EstimationLimitsParameter.ExecutionContext = null; 82 ApplyLinearScalingParameter.ExecutionContext = null; 72 83 73 84 return quality; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
r7259 r8664 47 47 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 48 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );49 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 50 QualitiesParameter.ActualValue = new DoubleArray(qualities); 51 51 return base.Apply(); 52 52 } 53 53 54 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows ) {54 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 57 OnlineCalculatorError errorState; 58 double r2 = OnlinePearsonsRSquaredCalculator.Calculate(estimatedValues, originalValues, out errorState); 59 if (errorState != OnlineCalculatorError.None) r2 = 0.0; 60 return new double[] { r2, solution.Length }; 58 59 double r2; 60 if (applyLinearScaling) { 61 var r2Calculator = new OnlinePearsonsRSquaredCalculator(); 62 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, r2Calculator, problemData.Dataset.Rows); 63 errorState = r2Calculator.ErrorState; 64 r2 = r2Calculator.RSquared; 65 } else { 66 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 67 r2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 68 } 69 70 if (errorState != OnlineCalculatorError.None) r2 = double.NaN; 71 return new double[2] { r2, solution.Length }; 61 72 } 62 73 … … 64 75 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 65 76 EstimationLimitsParameter.ExecutionContext = context; 77 ApplyLinearScalingParameter.ExecutionContext = context; 66 78 67 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );79 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 68 80 69 81 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 70 82 EstimationLimitsParameter.ExecutionContext = null; 83 ApplyLinearScalingParameter.ExecutionContext = null; 71 84 72 85 return quality; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveProblem.cs
r8175 r8664 65 65 EstimationLimitsParameter.Hidden = true; 66 66 67 ApplyLinearScalingParameter.Value.Value = true; 67 68 Maximization = new BoolArray(new bool[] { true, false }); 68 69 MaximumSymbolicExpressionTreeDepth.Value = InitialMaximumTreeDepth; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveTrainingBestSolutionAnalyzer.cs
r7259 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 38 37 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 39 38 private const string EstimationLimitsParameterName = "EstimationLimits"; 40 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";41 39 #region parameter properties 42 40 public ILookupParameter<IRegressionProblemData> ProblemDataParameter { … … 48 46 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { 49 47 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 50 }51 public IValueParameter<BoolValue> ApplyLinearScalingParameter {52 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }53 }54 #endregion55 56 #region properties57 public BoolValue ApplyLinearScaling {58 get { return ApplyLinearScalingParameter.Value; }59 48 } 60 49 #endregion … … 68 57 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 69 58 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.")); 70 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true)));71 59 } 72 60 … … 77 65 protected override ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQuality) { 78 66 var model = new SymbolicRegressionModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 79 if (ApplyLinearScaling.Value) 80 SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue); 67 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 81 68 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 82 69 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveValidationBestSolutionAnalyzer.cs
r7259 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 36 35 ISymbolicDataAnalysisBoundedOperator { 37 36 private const string EstimationLimitsParameterName = "EstimationLimits"; 38 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";39 37 40 38 #region parameter properties … … 42 40 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 43 41 } 44 public IValueParameter<BoolValue> ApplyLinearScalingParameter {45 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }46 }47 42 #endregion 48 43 49 #region properties50 public BoolValue ApplyLinearScaling {51 get { return ApplyLinearScalingParameter.Value; }52 }53 #endregion54 44 [StorableConstructor] 55 45 private SymbolicRegressionMultiObjectiveValidationBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 58 48 : base() { 59 49 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.")); 60 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true)));61 50 } 62 51 public override IDeepCloneable Clone(Cloner cloner) { … … 66 55 protected override ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQuality) { 67 56 var model = new SymbolicRegressionModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 68 if (ApplyLinearScaling.Value) 69 SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue); 57 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 70 58 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 71 59 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs
r8053 r8664 106 106 IEnumerable<int> constantOptimizationRows = GenerateRowsToEvaluate(ConstantOptimizationRowsPercentage.Value); 107 107 quality = OptimizeConstants(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, ProblemDataParameter.ActualValue, 108 constantOptimizationRows, ConstantOptimizationImprovement.Value, ConstantOptimizationIterations.Value, 0.001,108 constantOptimizationRows, ApplyLinearScalingParameter.ActualValue.Value, ConstantOptimizationImprovement.Value, ConstantOptimizationIterations.Value, 0.001, 109 109 EstimationLimitsParameter.ActualValue.Upper, EstimationLimitsParameter.ActualValue.Lower, 110 110 EvaluatedTreesParameter.ActualValue, EvaluatedTreeNodesParameter.ActualValue); 111 111 if (ConstantOptimizationRowsPercentage.Value != RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value) { 112 112 var evaluationRows = GenerateRowsToEvaluate(); 113 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, evaluationRows );113 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, evaluationRows, ApplyLinearScalingParameter.ActualValue.Value); 114 114 } 115 115 } else { 116 116 var evaluationRows = GenerateRowsToEvaluate(); 117 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, evaluationRows );117 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, evaluationRows, ApplyLinearScalingParameter.ActualValue.Value); 118 118 } 119 119 QualityParameter.ActualValue = new DoubleValue(quality); … … 145 145 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 146 146 EstimationLimitsParameter.ExecutionContext = context; 147 148 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows); 147 ApplyLinearScalingParameter.ExecutionContext = context; 148 149 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 149 150 150 151 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 151 152 EstimationLimitsParameter.ExecutionContext = null; 153 ApplyLinearScalingParameter.ExecutionContext = context; 152 154 153 155 return r2; … … 155 157 156 158 public static double OptimizeConstants(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, IRegressionProblemData problemData, 157 IEnumerable<int> rows, double improvement, int iterations, double differentialStep, double upperEstimationLimit = double.MaxValue, double lowerEstimationLimit = double.MinValue, IntValue evaluatedTrees = null, IntValue evaluatedTreeNodes = null) {159 IEnumerable<int> rows, bool applyLinearScaling, double improvement, int iterations, double differentialStep, double upperEstimationLimit = double.MaxValue, double lowerEstimationLimit = double.MinValue, IntValue evaluatedTrees = null, IntValue evaluatedTreeNodes = null) { 158 160 List<SymbolicExpressionTreeTerminalNode> terminalNodes = tree.Root.IterateNodesPrefix().OfType<SymbolicExpressionTreeTerminalNode>().ToList(); 159 161 double[] c = new double[terminalNodes.Count]; … … 179 181 alglib.minlmcreatev(1, c, diffstep, out state); 180 182 alglib.minlmsetcond(state, epsg, epsf, epsx, maxits); 181 alglib.minlmoptimize(state, CreateCallBack(interpreter, tree, problemData, rows, upperEstimationLimit, lowerEstimationLimit, treeLength, evaluatedTrees, evaluatedTreeNodes), null, terminalNodes);183 alglib.minlmoptimize(state, CreateCallBack(interpreter, tree, problemData, rows, applyLinearScaling, upperEstimationLimit, lowerEstimationLimit, treeLength, evaluatedTrees, evaluatedTreeNodes), null, terminalNodes); 182 184 alglib.minlmresults(state, out c, out report); 183 185 … … 192 194 } 193 195 194 private static alglib.ndimensional_fvec CreateCallBack(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows, double upperEstimationLimit, double lowerEstimationLimit, int treeLength, IntValue evaluatedTrees = null, IntValue evaluatedTreeNodes = null) {196 private static alglib.ndimensional_fvec CreateCallBack(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, double upperEstimationLimit, double lowerEstimationLimit, int treeLength, IntValue evaluatedTrees = null, IntValue evaluatedTreeNodes = null) { 195 197 return (double[] arg, double[] fi, object obj) => { 196 198 // update constants of tree … … 203 205 } 204 206 205 double quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, tree, lowerEstimationLimit, upperEstimationLimit, problemData, rows );207 double quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, tree, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling); 206 208 207 209 fi[0] = 1 - quality; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveEvaluator.cs
r8639 r8664 30 30 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { 31 31 [StorableClass] 32 public abstract class SymbolicRegressionSingleObjectiveEvaluator : SymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData>, ISymbolicRegressionSingleObjectiveEvaluator { 33 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; 34 public IFixedValueParameter<BoolValue> ApplyLinearScalingParameter { 35 get { return (IFixedValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 36 } 37 public bool ApplyLinearScaling { 38 get { return ApplyLinearScalingParameter.Value.Value; } 39 set { ApplyLinearScalingParameter.Value.Value = value; } 40 } 41 32 public abstract class SymbolicRegressionSingleObjectiveEvaluator : SymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData>, ISymbolicRegressionSingleObjectiveEvaluator { 42 33 [StorableConstructor] 43 34 protected SymbolicRegressionSingleObjectiveEvaluator(bool deserializing) : base(deserializing) { } 44 35 protected SymbolicRegressionSingleObjectiveEvaluator(SymbolicRegressionSingleObjectiveEvaluator original, Cloner cloner) : base(original, cloner) { } 45 protected SymbolicRegressionSingleObjectiveEvaluator() 46 : base() { 47 Parameters.Add(new FixedValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.", new BoolValue(true))); 48 ApplyLinearScalingParameter.Hidden = true; 49 } 50 51 [StorableHook(HookType.AfterDeserialization)] 52 private void AfterDeserialization() { 53 if (!Parameters.ContainsKey(ApplyLinearScalingParameterName)) { 54 Parameters.Add(new FixedValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.", new BoolValue(false))); 55 ApplyLinearScalingParameter.Hidden = true; 56 } 57 } 58 59 [ThreadStatic] 60 private static double[] cache; 61 62 protected static void CalculateWithScaling(IEnumerable<double> targetValues, IEnumerable<double> estimatedValues, 63 double lowerEstimationLimit, double upperEstimationLimit, 64 IOnlineCalculator calculator, int maxRows) { 65 if (cache == null || cache.GetLength(0) < maxRows) { 66 cache = new double[maxRows]; 67 } 68 69 //calculate linear scaling 70 //the static methods of the calculator could not be used as it performs a check if the enumerators have an equal amount of elements 71 //this is not true if the cache is used 72 int i = 0; 73 var linearScalingCalculator = new OnlineLinearScalingParameterCalculator(); 74 var targetValuesEnumerator = targetValues.GetEnumerator(); 75 var estimatedValuesEnumerator = estimatedValues.GetEnumerator(); 76 while (targetValuesEnumerator.MoveNext() & estimatedValuesEnumerator.MoveNext()) { 77 double target = targetValuesEnumerator.Current; 78 double estimated = estimatedValuesEnumerator.Current; 79 cache[i] = estimated; 80 if (!double.IsNaN(estimated) && !double.IsInfinity(estimated)) 81 linearScalingCalculator.Add(estimated, target); 82 i++; 83 } 84 if (linearScalingCalculator.ErrorState == OnlineCalculatorError.None && (targetValuesEnumerator.MoveNext() || estimatedValuesEnumerator.MoveNext())) 85 throw new ArgumentException("Number of elements in target and estimated values enumeration do not match."); 86 87 double alpha = linearScalingCalculator.Alpha; 88 double beta = linearScalingCalculator.Beta; 89 if (linearScalingCalculator.ErrorState != OnlineCalculatorError.None) { 90 alpha = 0.0; 91 beta = 1.0; 92 } 93 94 //calculate the quality by using the passed online calculator 95 targetValuesEnumerator = targetValues.GetEnumerator(); 96 var scaledBoundedEstimatedValuesEnumerator = Enumerable.Range(0, i).Select(x => cache[x] * beta + alpha) 97 .LimitToRange(lowerEstimationLimit, upperEstimationLimit).GetEnumerator(); 98 99 while (targetValuesEnumerator.MoveNext() & scaledBoundedEstimatedValuesEnumerator.MoveNext()) { 100 calculator.Add(targetValuesEnumerator.Current, scaledBoundedEstimatedValuesEnumerator.Current); 101 } 102 } 36 protected SymbolicRegressionSingleObjectiveEvaluator(): base() {} 103 37 } 104 38 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMaxAbsoluteErrorEvaluator.cs
r8113 r8664 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using HeuristicLab.Common; … … 47 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 47 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScaling );48 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 49 QualityParameter.ActualValue = new DoubleValue(quality); 51 50 … … 68 67 mse = OnlineMaxAbsoluteErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 69 68 } 70 if (errorState != OnlineCalculatorError.None) return Double.NaN;71 elsereturn mse;69 if (errorState != OnlineCalculatorError.None) return double.NaN; 70 return mse; 72 71 } 73 72 … … 75 74 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 76 75 EstimationLimitsParameter.ExecutionContext = context; 76 ApplyLinearScalingParameter.ExecutionContext = context; 77 77 78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScaling );78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 79 79 80 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 81 81 EstimationLimitsParameter.ExecutionContext = null; 82 ApplyLinearScalingParameter.ExecutionContext = null; 82 83 83 84 return mse; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanAbsoluteErrorEvaluator.cs
r8634 r8664 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using HeuristicLab.Common; … … 47 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 47 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScaling );48 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 49 QualityParameter.ActualValue = new DoubleValue(quality); 51 50 … … 68 67 mae = OnlineMeanAbsoluteErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 69 68 } 70 if (errorState != OnlineCalculatorError.None) return Double.NaN;71 elsereturn mae;69 if (errorState != OnlineCalculatorError.None) return double.NaN; 70 return mae; 72 71 } 73 72 … … 75 74 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 76 75 EstimationLimitsParameter.ExecutionContext = context; 76 ApplyLinearScalingParameter.ExecutionContext = context; 77 77 78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScaling );78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 79 79 80 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 81 81 EstimationLimitsParameter.ExecutionContext = null; 82 ApplyLinearScalingParameter.ExecutionContext = null; 82 83 83 84 return mse; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs
r8113 r8664 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using HeuristicLab.Common; … … 47 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 47 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScaling );48 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 49 QualityParameter.ActualValue = new DoubleValue(quality); 51 50 … … 68 67 mse = OnlineMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 69 68 } 70 if (errorState != OnlineCalculatorError.None) return Double.NaN;71 elsereturn mse;69 if (errorState != OnlineCalculatorError.None) return double.NaN; 70 return mse; 72 71 } 73 72 … … 75 74 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 76 75 EstimationLimitsParameter.ExecutionContext = context; 76 ApplyLinearScalingParameter.ExecutionContext = context; 77 77 78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScaling );78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 79 79 80 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 81 81 EstimationLimitsParameter.ExecutionContext = null; 82 ApplyLinearScalingParameter.ExecutionContext = null; 82 83 83 84 return mse; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.cs
r7672 r8664 48 48 IEnumerable<int> rows = GenerateRowsToEvaluate(); 49 49 50 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );50 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 51 51 QualityParameter.ActualValue = new DoubleValue(quality); 52 52 … … 54 54 } 55 55 56 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows ) {56 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 57 57 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 58 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);58 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 59 59 OnlineCalculatorError errorState; 60 double r2 = OnlinePearsonsRSquaredCalculator.Calculate(estimatedValues, originalValues, out errorState); 61 if (errorState != OnlineCalculatorError.None) return 0.0; 62 else return r2; 60 61 double r2; 62 if (applyLinearScaling) { 63 var r2Calculator = new OnlinePearsonsRSquaredCalculator(); 64 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, r2Calculator, problemData.Dataset.Rows); 65 errorState = r2Calculator.ErrorState; 66 r2 = r2Calculator.RSquared; 67 } else { 68 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 69 r2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 70 } 71 if (errorState != OnlineCalculatorError.None) return double.NaN; 72 return r2; 63 73 } 64 74 … … 66 76 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 67 77 EstimationLimitsParameter.ExecutionContext = context; 78 ApplyLinearScalingParameter.ExecutionContext = context; 68 79 69 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );80 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 70 81 71 82 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 72 83 EstimationLimitsParameter.ExecutionContext = null; 84 ApplyLinearScalingParameter.ExecutionContext = null; 73 85 74 86 return r2; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveProblem.cs
r8175 r8664 61 61 EstimationLimitsParameter.Hidden = true; 62 62 63 64 ApplyLinearScalingParameter.Value.Value = true; 63 65 Maximization.Value = true; 64 66 MaximumSymbolicExpressionTreeDepth.Value = InitialMaximumTreeDepth; -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveTrainingBestSolutionAnalyzer.cs
r7259 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 38 37 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 39 38 private const string EstimationLimitsParameterName = "EstimationLimits"; 40 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";41 39 #region parameter properties 42 40 public ILookupParameter<IRegressionProblemData> ProblemDataParameter { … … 48 46 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { 49 47 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 50 }51 public IValueParameter<BoolValue> ApplyLinearScalingParameter {52 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }53 }54 #endregion55 56 #region properties57 public BoolValue ApplyLinearScaling {58 get { return ApplyLinearScalingParameter.Value; }59 48 } 60 49 #endregion … … 68 57 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 69 58 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.")); 70 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true)));71 59 } 72 60 public override IDeepCloneable Clone(Cloner cloner) { … … 76 64 protected override ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 77 65 var model = new SymbolicRegressionModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 78 if (ApplyLinearScaling.Value) 79 SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue); 66 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 80 67 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 81 68 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs
r8169 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 using HeuristicLab.Parameters;27 25 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 26 … … 34 32 [StorableClass] 35 33 public sealed class SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveTrainingParetoBestSolutionAnalyzer<IRegressionProblemData, ISymbolicRegressionSolution> { 36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";37 #region parameter properties38 public IValueParameter<BoolValue> ApplyLinearScalingParameter {39 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }40 }41 #endregion42 43 #region properties44 public BoolValue ApplyLinearScaling {45 get { return ApplyLinearScalingParameter.Value; }46 }47 #endregion48 34 49 35 [StorableConstructor] 50 36 private SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } 51 37 private SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer(SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { } 52 public SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer() 53 : base() { 54 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true))); 55 } 38 public SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer() : base() { } 56 39 public override IDeepCloneable Clone(Cloner cloner) { 57 40 return new SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer(this, cloner); … … 60 43 protected override ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree bestTree) { 61 44 var model = new SymbolicRegressionModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 62 if (ApplyLinearScaling.Value) 63 SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue); 45 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 64 46 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 65 47 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveValidationBestSolutionAnalyzer.cs
r7259 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 36 35 ISymbolicDataAnalysisBoundedOperator { 37 36 private const string EstimationLimitsParameterName = "EstimationLimits"; 38 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";39 37 40 38 #region parameter properties 41 39 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { 42 40 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 43 }44 public IValueParameter<BoolValue> ApplyLinearScalingParameter {45 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }46 }47 #endregion48 49 #region properties50 public BoolValue ApplyLinearScaling {51 get { return ApplyLinearScalingParameter.Value; }52 41 } 53 42 #endregion … … 59 48 : base() { 60 49 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.")); 61 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true)));62 50 } 63 51 … … 68 56 protected override ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 69 57 var model = new SymbolicRegressionModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 70 if (ApplyLinearScaling.Value) 71 SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue); 58 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 72 59 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 73 60 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer.cs
r8169 r8664 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 using HeuristicLab.Parameters;27 25 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 26 … … 34 32 [StorableClass] 35 33 public sealed class SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveValidationParetoBestSolutionAnalyzer<ISymbolicRegressionSolution, ISymbolicRegressionSingleObjectiveEvaluator, IRegressionProblemData> { 36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";37 #region parameter properties38 public IValueParameter<BoolValue> ApplyLinearScalingParameter {39 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }40 }41 #endregion42 43 #region properties44 public BoolValue ApplyLinearScaling {45 get { return ApplyLinearScalingParameter.Value; }46 }47 #endregion48 49 34 [StorableConstructor] 50 35 private SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } 51 36 private SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer(SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { } 52 public SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer() 53 : base() { 54 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true))); 55 } 37 public SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer() : base() { } 38 56 39 public override IDeepCloneable Clone(Cloner cloner) { 57 40 return new SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer(this, cloner); … … 60 43 protected override ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree bestTree) { 61 44 var model = new SymbolicRegressionModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 62 if (ApplyLinearScaling.Value) 63 SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue); 45 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicRegressionModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 64 46 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 65 47 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs
r8639 r8664 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using HeuristicLab.Common; … … 70 69 return CreateRegressionSolution(problemData); 71 70 } 72 73 public static void Scale(SymbolicRegressionModel model, IRegressionProblemData problemData) {74 var dataset = problemData.Dataset;75 var targetVariable = problemData.TargetVariable;76 var rows = problemData.TrainingIndices;77 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, rows);78 var targetValues = dataset.GetDoubleValues(targetVariable, rows);79 80 var linearScalingCalculator = new OnlineLinearScalingParameterCalculator();81 var targetValuesEnumerator = targetValues.GetEnumerator();82 var estimatedValuesEnumerator = estimatedValues.GetEnumerator();83 while (targetValuesEnumerator.MoveNext() & estimatedValuesEnumerator.MoveNext()) {84 double target = targetValuesEnumerator.Current;85 double estimated = estimatedValuesEnumerator.Current;86 if (!double.IsNaN(estimated) && !double.IsInfinity(estimated))87 linearScalingCalculator.Add(estimated, target);88 }89 if (linearScalingCalculator.ErrorState == OnlineCalculatorError.None && (targetValuesEnumerator.MoveNext() || estimatedValuesEnumerator.MoveNext()))90 throw new ArgumentException("Number of elements in target and estimated values enumeration do not match.");91 92 double alpha = linearScalingCalculator.Alpha;93 double beta = linearScalingCalculator.Beta;94 if (linearScalingCalculator.ErrorState != OnlineCalculatorError.None) return;95 96 ConstantTreeNode alphaTreeNode = null;97 ConstantTreeNode betaTreeNode = null;98 // check if model has been scaled previously by analyzing the structure of the tree99 var startNode = model.SymbolicExpressionTree.Root.GetSubtree(0);100 if (startNode.GetSubtree(0).Symbol is Addition) {101 var addNode = startNode.GetSubtree(0);102 if (addNode.SubtreeCount == 2 && addNode.GetSubtree(0).Symbol is Multiplication && addNode.GetSubtree(1).Symbol is Constant) {103 alphaTreeNode = addNode.GetSubtree(1) as ConstantTreeNode;104 var mulNode = addNode.GetSubtree(0);105 if (mulNode.SubtreeCount == 2 && mulNode.GetSubtree(1).Symbol is Constant) {106 betaTreeNode = mulNode.GetSubtree(1) as ConstantTreeNode;107 }108 }109 }110 // if tree structure matches the structure necessary for linear scaling then reuse the existing tree nodes111 if (alphaTreeNode != null && betaTreeNode != null) {112 betaTreeNode.Value *= beta;113 alphaTreeNode.Value *= beta;114 alphaTreeNode.Value += alpha;115 } else {116 var mainBranch = startNode.GetSubtree(0);117 startNode.RemoveSubtree(0);118 var scaledMainBranch = MakeSum(MakeProduct(mainBranch, beta), alpha);119 startNode.AddSubtree(scaledMainBranch);120 }121 }122 123 private static ISymbolicExpressionTreeNode MakeSum(ISymbolicExpressionTreeNode treeNode, double alpha) {124 if (alpha.IsAlmost(0.0)) {125 return treeNode;126 } else {127 var addition = new Addition();128 var node = addition.CreateTreeNode();129 var alphaConst = MakeConstant(alpha);130 node.AddSubtree(treeNode);131 node.AddSubtree(alphaConst);132 return node;133 }134 }135 136 private static ISymbolicExpressionTreeNode MakeProduct(ISymbolicExpressionTreeNode treeNode, double beta) {137 if (beta.IsAlmost(1.0)) {138 return treeNode;139 } else {140 var multipliciation = new Multiplication();141 var node = multipliciation.CreateTreeNode();142 var betaConst = MakeConstant(beta);143 node.AddSubtree(treeNode);144 node.AddSubtree(betaConst);145 return node;146 }147 }148 149 private static ISymbolicExpressionTreeNode MakeConstant(double c) {150 var node = (ConstantTreeNode)(new Constant()).CreateTreeNode();151 node.Value = c;152 return node;153 }154 71 } 155 72 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveAnalyzer.cs
r7259 r8664 20 20 #endregion 21 21 22 using System.Collections.Generic;23 using System.Linq;24 22 using HeuristicLab.Common; 25 23 using HeuristicLab.Core; 26 24 using HeuristicLab.Data; 27 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;28 using HeuristicLab.Operators;29 25 using HeuristicLab.Parameters; 30 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 31 using HeuristicLab.Optimization;32 27 33 28 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { … … 39 34 private const string QualitiesParameterName = "Qualities"; 40 35 private const string MaximizationParameterName = "Maximization"; 36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; 41 37 #region parameter properties 42 38 public IScopeTreeLookupParameter<DoubleArray> QualitiesParameter { … … 45 41 public ILookupParameter<BoolArray> MaximizationParameter { 46 42 get { return (ILookupParameter<BoolArray>)Parameters[MaximizationParameterName]; } 43 } 44 public ILookupParameter<BoolValue> ApplyLinearScalingParameter { 45 get { return (ILookupParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 47 46 } 48 47 #endregion … … 64 63 Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>(QualitiesParameterName, "The qualities of the trees that should be analyzed.")); 65 64 Parameters.Add(new LookupParameter<BoolArray>(MaximizationParameterName, "The directions of optimization for each dimension.")); 65 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.")); 66 } 67 68 [StorableHook(HookType.AfterDeserialization)] 69 private void AfterDeserialization() { 70 if (Parameters.ContainsKey(ApplyLinearScalingParameterName) && Parameters[ApplyLinearScalingParameterName] is LookupParameter<BoolValue>) 71 Parameters.Remove(ApplyLinearScalingParameterName); 72 if (!Parameters.ContainsKey(ApplyLinearScalingParameterName)) 73 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.")); 66 74 } 67 75 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveAnalyzer.cs
r7259 r8664 20 20 #endregion 21 21 22 using System.Collections.Generic;23 using System.Linq;24 22 using HeuristicLab.Common; 25 23 using HeuristicLab.Core; 26 24 using HeuristicLab.Data; 27 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;28 using HeuristicLab.Operators;29 25 using HeuristicLab.Parameters; 30 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 31 using HeuristicLab.Optimization;32 27 33 28 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { … … 39 34 private const string QualityParameterName = "Quality"; 40 35 private const string MaximizationParameterName = "Maximization"; 36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; 37 41 38 #region parameter properties 42 39 public IScopeTreeLookupParameter<DoubleValue> QualityParameter { … … 45 42 public ILookupParameter<BoolValue> MaximizationParameter { 46 43 get { return (ILookupParameter<BoolValue>)Parameters[MaximizationParameterName]; } 44 } 45 public ILookupParameter<BoolValue> ApplyLinearScalingParameter { 46 get { return (ILookupParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 47 47 } 48 48 #endregion … … 64 64 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The qualities of the trees that should be analyzed.")); 65 65 Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization.")); 66 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.")); 67 } 68 69 [StorableHook(HookType.AfterDeserialization)] 70 private void AfterDeserialization() { 71 if (Parameters.ContainsKey(ApplyLinearScalingParameterName) && !(Parameters[ApplyLinearScalingParameterName] is LookupParameter<BoolValue>)) 72 Parameters.Remove(ApplyLinearScalingParameterName); 73 if (!Parameters.ContainsKey(ApplyLinearScalingParameterName)) 74 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.")); 66 75 } 67 76 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Evaluators/SymbolicDataAnalysisEvaluator.cs
r7259 r8664 44 44 private const string EvaluationPartitionParameterName = "EvaluationPartition"; 45 45 private const string RelativeNumberOfEvaluatedSamplesParameterName = "RelativeNumberOfEvaluatedSamples"; 46 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; 46 47 47 48 public override bool CanChangeName { get { return false; } } … … 70 71 get { return (IValueLookupParameter<PercentValue>)Parameters[RelativeNumberOfEvaluatedSamplesParameterName]; } 71 72 } 73 public ILookupParameter<BoolValue> ApplyLinearScalingParameter { 74 get { return (ILookupParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 75 } 72 76 #endregion 73 77 … … 87 91 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The upper and lower limit that should be used as cut off value for the output values of symbolic data analysis trees.")); 88 92 Parameters.Add(new ValueLookupParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index.")); 93 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.")); 94 } 95 96 [StorableHook(HookType.AfterDeserialization)] 97 private void AfterDeserialization() { 98 if (Parameters.ContainsKey(ApplyLinearScalingParameterName) && !(Parameters[ApplyLinearScalingParameterName] is LookupParameter<BoolValue>)) 99 Parameters.Remove(ApplyLinearScalingParameterName); 100 if (!Parameters.ContainsKey(ApplyLinearScalingParameterName)) 101 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating.")); 89 102 } 90 103 … … 94 107 95 108 protected IEnumerable<int> GenerateRowsToEvaluate(double percentageOfRows) { 96 97 98 109 IEnumerable<int> rows; 99 110 int samplesStart = EvaluationPartitionParameter.ActualValue.Start; … … 115 126 return rows.Where(i => i < testPartitionStart || testPartitionEnd <= i); 116 127 } 128 129 [ThreadStatic] 130 private static double[] cache; 131 protected static void CalculateWithScaling(IEnumerable<double> targetValues, IEnumerable<double> estimatedValues, 132 double lowerEstimationLimit, double upperEstimationLimit, 133 IOnlineCalculator calculator, int maxRows) { 134 if (cache == null || cache.GetLength(0) < maxRows) { 135 cache = new double[maxRows]; 136 } 137 138 //calculate linear scaling 139 //the static methods of the calculator could not be used as it performs a check if the enumerators have an equal amount of elements 140 //this is not true if the cache is used 141 int i = 0; 142 var linearScalingCalculator = new OnlineLinearScalingParameterCalculator(); 143 var targetValuesEnumerator = targetValues.GetEnumerator(); 144 var estimatedValuesEnumerator = estimatedValues.GetEnumerator(); 145 while (targetValuesEnumerator.MoveNext() & estimatedValuesEnumerator.MoveNext()) { 146 double target = targetValuesEnumerator.Current; 147 double estimated = estimatedValuesEnumerator.Current; 148 cache[i] = estimated; 149 if (!double.IsNaN(estimated) && !double.IsInfinity(estimated)) 150 linearScalingCalculator.Add(estimated, target); 151 i++; 152 } 153 if (linearScalingCalculator.ErrorState == OnlineCalculatorError.None && (targetValuesEnumerator.MoveNext() || estimatedValuesEnumerator.MoveNext())) 154 throw new ArgumentException("Number of elements in target and estimated values enumeration do not match."); 155 156 double alpha = linearScalingCalculator.Alpha; 157 double beta = linearScalingCalculator.Beta; 158 if (linearScalingCalculator.ErrorState != OnlineCalculatorError.None) { 159 alpha = 0.0; 160 beta = 1.0; 161 } 162 163 //calculate the quality by using the passed online calculator 164 targetValuesEnumerator = targetValues.GetEnumerator(); 165 var scaledBoundedEstimatedValuesEnumerator = Enumerable.Range(0, i).Select(x => cache[x] * beta + alpha) 166 .LimitToRange(lowerEstimationLimit, upperEstimationLimit).GetEnumerator(); 167 168 while (targetValuesEnumerator.MoveNext() & scaledBoundedEstimatedValuesEnumerator.MoveNext()) { 169 calculator.Add(targetValuesEnumerator.Current, scaledBoundedEstimatedValuesEnumerator.Current); 170 } 171 } 117 172 } 118 173 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisEvaluator.cs
r7259 r8664 29 29 IValueLookupParameter<IntRange> EvaluationPartitionParameter { get; } 30 30 IValueLookupParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter { get; } 31 ILookupParameter<BoolValue> ApplyLinearScalingParameter { get; } 31 32 32 33 IValueLookupParameter<T> ProblemDataParameter { get; } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisMultiObjectiveAnalyzer.cs
r7259 r8664 21 21 using HeuristicLab.Core; 22 22 using HeuristicLab.Data; 23 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;24 using HeuristicLab.Optimization;25 using HeuristicLab.Parameters;26 23 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { 27 24 public interface ISymbolicDataAnalysisMultiObjectiveAnalyzer : ISymbolicDataAnalysisAnalyzer { 28 25 IScopeTreeLookupParameter<DoubleArray> QualitiesParameter { get; } 29 26 ILookupParameter<BoolArray> MaximizationParameter { get; } 27 ILookupParameter<BoolValue> ApplyLinearScalingParameter { get; } 30 28 31 29 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisSingleObjectiveAnalyzer.cs
r7259 r8664 28 28 IScopeTreeLookupParameter<DoubleValue> QualityParameter { get; } 29 29 ILookupParameter<BoolValue> MaximizationParameter { get; } 30 ILookupParameter<BoolValue> ApplyLinearScalingParameter { get; } 30 31 } 31 32 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisModel.cs
r7259 r8664 20 20 #endregion 21 21 22 using System; 22 23 using System.Drawing; 23 24 using HeuristicLab.Common; … … 66 67 this.interpreter = interpreter; 67 68 } 69 70 #region Scaling 71 public static void Scale(ISymbolicDataAnalysisModel model, IDataAnalysisProblemData problemData, string targetVariable) { 72 var dataset = problemData.Dataset; 73 var rows = problemData.TrainingIndices; 74 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, rows); 75 var targetValues = dataset.GetDoubleValues(targetVariable, rows); 76 77 var linearScalingCalculator = new OnlineLinearScalingParameterCalculator(); 78 var targetValuesEnumerator = targetValues.GetEnumerator(); 79 var estimatedValuesEnumerator = estimatedValues.GetEnumerator(); 80 while (targetValuesEnumerator.MoveNext() & estimatedValuesEnumerator.MoveNext()) { 81 double target = targetValuesEnumerator.Current; 82 double estimated = estimatedValuesEnumerator.Current; 83 if (!double.IsNaN(estimated) && !double.IsInfinity(estimated)) 84 linearScalingCalculator.Add(estimated, target); 85 } 86 if (linearScalingCalculator.ErrorState == OnlineCalculatorError.None && (targetValuesEnumerator.MoveNext() || estimatedValuesEnumerator.MoveNext())) 87 throw new ArgumentException("Number of elements in target and estimated values enumeration do not match."); 88 89 double alpha = linearScalingCalculator.Alpha; 90 double beta = linearScalingCalculator.Beta; 91 if (linearScalingCalculator.ErrorState != OnlineCalculatorError.None) return; 92 93 ConstantTreeNode alphaTreeNode = null; 94 ConstantTreeNode betaTreeNode = null; 95 // check if model has been scaled previously by analyzing the structure of the tree 96 var startNode = model.SymbolicExpressionTree.Root.GetSubtree(0); 97 if (startNode.GetSubtree(0).Symbol is Addition) { 98 var addNode = startNode.GetSubtree(0); 99 if (addNode.SubtreeCount == 2 && addNode.GetSubtree(0).Symbol is Multiplication && addNode.GetSubtree(1).Symbol is Constant) { 100 alphaTreeNode = addNode.GetSubtree(1) as ConstantTreeNode; 101 var mulNode = addNode.GetSubtree(0); 102 if (mulNode.SubtreeCount == 2 && mulNode.GetSubtree(1).Symbol is Constant) { 103 betaTreeNode = mulNode.GetSubtree(1) as ConstantTreeNode; 104 } 105 } 106 } 107 // if tree structure matches the structure necessary for linear scaling then reuse the existing tree nodes 108 if (alphaTreeNode != null && betaTreeNode != null) { 109 betaTreeNode.Value *= beta; 110 alphaTreeNode.Value *= beta; 111 alphaTreeNode.Value += alpha; 112 } else { 113 var mainBranch = startNode.GetSubtree(0); 114 startNode.RemoveSubtree(0); 115 var scaledMainBranch = MakeSum(MakeProduct(mainBranch, beta), alpha); 116 startNode.AddSubtree(scaledMainBranch); 117 } 118 } 119 120 private static ISymbolicExpressionTreeNode MakeSum(ISymbolicExpressionTreeNode treeNode, double alpha) { 121 if (alpha.IsAlmost(0.0)) { 122 return treeNode; 123 } else { 124 var addition = new Addition(); 125 var node = addition.CreateTreeNode(); 126 var alphaConst = MakeConstant(alpha); 127 node.AddSubtree(treeNode); 128 node.AddSubtree(alphaConst); 129 return node; 130 } 131 } 132 133 private static ISymbolicExpressionTreeNode MakeProduct(ISymbolicExpressionTreeNode treeNode, double beta) { 134 if (beta.IsAlmost(1.0)) { 135 return treeNode; 136 } else { 137 var multipliciation = new Multiplication(); 138 var node = multipliciation.CreateTreeNode(); 139 var betaConst = MakeConstant(beta); 140 node.AddSubtree(treeNode); 141 node.AddSubtree(betaConst); 142 return node; 143 } 144 } 145 146 private static ISymbolicExpressionTreeNode MakeConstant(double c) { 147 var node = (ConstantTreeNode)(new Constant()).CreateTreeNode(); 148 node.Value = c; 149 return node; 150 } 151 #endregion 68 152 } 69 153 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisProblem.cs
r8203 r8664 53 53 private const string FitnessCalculationPartitionParameterName = "FitnessCalculationPartition"; 54 54 private const string ValidationPartitionParameterName = "ValidationPartition"; 55 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; 55 56 56 57 private const string ProblemDataParameterDescription = ""; … … 64 65 private const string FitnessCalculationPartitionParameterDescription = "The partition of the problem data training partition, that should be used to calculate the fitness of an individual."; 65 66 private const string ValidationPartitionParameterDescription = "The partition of the problem data training partition, that should be used to select the best model from (optional)."; 67 private const string ApplyLinearScalingParameterDescription = "Flag that indicates if the individual should be linearly scaled before evaluating."; 66 68 #endregion 67 69 … … 100 102 get { return (IFixedValueParameter<IntRange>)Parameters[ValidationPartitionParameterName]; } 101 103 } 104 public IFixedValueParameter<BoolValue> ApplyLinearScalingParameter { 105 get { return (IFixedValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 106 } 102 107 #endregion 103 108 … … 144 149 public IntRange ValidationPartition { 145 150 get { return ValidationPartitionParameter.Value; } 151 } 152 public BoolValue ApplyLinearScaling { 153 get { return ApplyLinearScalingParameter.Value; } 146 154 } 147 155 #endregion … … 151 159 [StorableHook(HookType.AfterDeserialization)] 152 160 private void AfterDeserialization() { 161 if (!Parameters.ContainsKey(ApplyLinearScalingParameterName)) { 162 Parameters.Add(new FixedValueParameter<BoolValue>(ApplyLinearScalingParameterName, ApplyLinearScalingParameterDescription, new BoolValue(false))); 163 ApplyLinearScalingParameter.Hidden = true; 164 } 165 153 166 RegisterEventHandlers(); 154 167 } … … 170 183 Parameters.Add(new FixedValueParameter<IntRange>(ValidationPartitionParameterName, ValidationPartitionParameterDescription)); 171 184 Parameters.Add(new FixedValueParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, RelativeNumberOfEvaluatedSamplesParameterDescription, new PercentValue(1))); 185 Parameters.Add(new FixedValueParameter<BoolValue>(ApplyLinearScalingParameterName, ApplyLinearScalingParameterDescription, new BoolValue(false))); 172 186 173 187 SymbolicExpressionTreeInterpreterParameter.Hidden = true; 174 188 MaximumFunctionArgumentsParameter.Hidden = true; 175 189 MaximumFunctionDefinitionsParameter.Hidden = true; 190 ApplyLinearScalingParameter.Hidden = true; 176 191 177 192 SymbolicExpressionTreeGrammar = new TypeCoherentExpressionGrammar(); … … 274 289 275 290 foreach (var op in operators.OfType<ISymbolicExpressionTreeGrammarBasedOperator>()) { 276 op.SymbolicExpressionTreeGrammarParameter.ActualName = SymbolicExpressionTreeGrammarParameter Name;291 op.SymbolicExpressionTreeGrammarParameter.ActualName = SymbolicExpressionTreeGrammarParameter.Name; 277 292 } 278 293 foreach (var op in operators.OfType<ISymbolicExpressionTreeSizeConstraintOperator>()) { 279 op.MaximumSymbolicExpressionTreeDepthParameter.ActualName = MaximumSymbolicExpressionTreeDepthParameter Name;280 op.MaximumSymbolicExpressionTreeLengthParameter.ActualName = MaximumSymbolicExpressionTreeLengthParameter Name;294 op.MaximumSymbolicExpressionTreeDepthParameter.ActualName = MaximumSymbolicExpressionTreeDepthParameter.Name; 295 op.MaximumSymbolicExpressionTreeLengthParameter.ActualName = MaximumSymbolicExpressionTreeLengthParameter.Name; 281 296 } 282 297 foreach (var op in operators.OfType<ISymbolicExpressionTreeArchitectureAlteringOperator>()) { 283 op.MaximumFunctionArgumentsParameter.ActualName = MaximumFunctionArgumentsParameter Name;284 op.MaximumFunctionDefinitionsParameter.ActualName = MaximumFunctionDefinitionsParameter Name;298 op.MaximumFunctionArgumentsParameter.ActualName = MaximumFunctionArgumentsParameter.Name; 299 op.MaximumFunctionDefinitionsParameter.ActualName = MaximumFunctionDefinitionsParameter.Name; 285 300 } 286 301 foreach (var op in operators.OfType<ISymbolicDataAnalysisEvaluator<T>>()) { … … 289 304 op.EvaluationPartitionParameter.ActualName = FitnessCalculationPartitionParameter.Name; 290 305 op.RelativeNumberOfEvaluatedSamplesParameter.ActualName = RelativeNumberOfEvaluatedSamplesParameter.Name; 306 op.ApplyLinearScalingParameter.ActualName = ApplyLinearScalingParameter.Name; 291 307 } 292 308 foreach (var op in operators.OfType<ISymbolicExpressionTreeCrossover>()) { … … 300 316 op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 301 317 } 318 foreach (var op in operators.OfType<ISymbolicDataAnalysisSingleObjectiveAnalyzer>()) { 319 op.ApplyLinearScalingParameter.ActualName = ApplyLinearScalingParameter.Name; 320 } 321 foreach (var op in operators.OfType<ISymbolicDataAnalysisMultiObjectiveAnalyzer>()) { 322 op.ApplyLinearScalingParameter.ActualName = ApplyLinearScalingParameter.Name; 323 } 302 324 foreach (var op in operators.OfType<ISymbolicDataAnalysisAnalyzer>()) { 303 325 op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; … … 308 330 } 309 331 foreach (var op in operators.OfType<ISymbolicDataAnalysisInterpreterOperator>()) { 310 op.SymbolicDataAnalysisTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter Name;332 op.SymbolicDataAnalysisTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name; 311 333 } 312 334 foreach (var op in operators.OfType<ISymbolicDataAnalysisExpressionCrossover<T>>()) { 313 op.EvaluationPartitionParameter.ActualName = FitnessCalculationPartitionParameter Name;335 op.EvaluationPartitionParameter.ActualName = FitnessCalculationPartitionParameter.Name; 314 336 op.ProblemDataParameter.ActualName = ProblemDataParameter.Name; 315 337 op.EvaluationPartitionParameter.ActualName = FitnessCalculationPartitionParameter.Name; -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj
r8600 r8664 151 151 <Compile Include="Interfaces\Regression\IRegressionEnsembleSolution.cs" /> 152 152 <Compile Include="Implementation\Regression\RegressionSolutionBase.cs" /> 153 <Compile Include="OnlineCalculators\OnlineBoundedMeanSquaredErrorCalculator.cs" /> 153 154 <Compile Include="OnlineCalculators\HoeffdingsDependenceCalculator.cs" /> 154 155 <Compile Include="OnlineCalculators\OnlineMaxAbsoluteErrorCalculator.cs" /> … … 280 281 --> 281 282 <PropertyGroup> 282 <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)283 <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir) 283 284 set ProjectDir=$(ProjectDir) 284 285 set SolutionDir=$(SolutionDir) … … 287 288 call PreBuildEvent.cmd 288 289 </PreBuildEvent> 289 <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">290 <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' "> 290 291 export ProjectDir=$(ProjectDir) 291 292 export SolutionDir=$(SolutionDir) -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/OnlineBoundedMeanSquaredErrorCalculator.cs
r8650 r8664 24 24 25 25 namespace HeuristicLab.Problems.DataAnalysis { 26 public class Online MeanSquaredErrorCalculator : IOnlineCalculator {26 public class OnlineBoundedMeanSquaredErrorCalculator : IOnlineCalculator { 27 27 28 private double sse;28 private double errorSum; 29 29 private int n; 30 public double MeanSquaredError {30 public double BoundedMeanSquaredError { 31 31 get { 32 return n > 0 ? sse/ n : 0.0;32 return n > 0 ? errorSum / n : 0.0; 33 33 } 34 34 } 35 35 36 public OnlineMeanSquaredErrorCalculator() { 36 public double LowerBound { get; private set; } 37 public double UpperBound { get; private set; } 38 39 40 public OnlineBoundedMeanSquaredErrorCalculator(double lowerBound, double upperbound) { 41 LowerBound = lowerBound; 42 UpperBound = upperbound; 37 43 Reset(); 38 44 } … … 44 50 } 45 51 public double Value { 46 get { return MeanSquaredError; }52 get { return BoundedMeanSquaredError; } 47 53 } 48 54 public void Reset() { 49 55 n = 0; 50 sse= 0.0;56 errorSum = 0.0; 51 57 errorState = OnlineCalculatorError.InsufficientElementsAdded; 52 58 } … … 58 64 } else { 59 65 double error = estimated - original; 60 sse += error * error; 66 if (estimated < LowerBound || estimated > UpperBound) 67 errorSum += Math.Abs(error); 68 else 69 errorSum += error * error; 61 70 n++; 62 71 errorState = errorState & (~OnlineCalculatorError.InsufficientElementsAdded); // n >= 1 … … 65 74 #endregion 66 75 67 public static double Calculate(IEnumerable<double> originalValues, IEnumerable<double> estimatedValues, out OnlineCalculatorError errorState) {76 public static double Calculate(IEnumerable<double> originalValues, IEnumerable<double> estimatedValues, double lowerBound, double upperBound, out OnlineCalculatorError errorState) { 68 77 IEnumerator<double> originalEnumerator = originalValues.GetEnumerator(); 69 78 IEnumerator<double> estimatedEnumerator = estimatedValues.GetEnumerator(); 70 Online MeanSquaredErrorCalculator mseCalculator = new OnlineMeanSquaredErrorCalculator();79 OnlineBoundedMeanSquaredErrorCalculator boundedMseCalculator = new OnlineBoundedMeanSquaredErrorCalculator(lowerBound, upperBound); 71 80 72 81 // always move forward both enumerators (do not use short-circuit evaluation!) … … 74 83 double original = originalEnumerator.Current; 75 84 double estimated = estimatedEnumerator.Current; 76 mseCalculator.Add(original, estimated);77 if ( mseCalculator.ErrorState != OnlineCalculatorError.None) break;85 boundedMseCalculator.Add(original, estimated); 86 if (boundedMseCalculator.ErrorState != OnlineCalculatorError.None) break; 78 87 } 79 88 80 89 // check if both enumerators are at the end to make sure both enumerations have the same length 81 if ( mseCalculator.ErrorState == OnlineCalculatorError.None &&90 if (boundedMseCalculator.ErrorState == OnlineCalculatorError.None && 82 91 (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext())) { 83 92 throw new ArgumentException("Number of elements in originalValues and estimatedValues enumerations doesn't match."); 84 93 } else { 85 errorState = mseCalculator.ErrorState;86 return mseCalculator.MeanSquaredError;94 errorState = boundedMseCalculator.ErrorState; 95 return boundedMseCalculator.BoundedMeanSquaredError; 87 96 } 88 97 } -
trunk/sources/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs
r8596 r8664 234 234 ga.SetSeedRandomly.Value = false; 235 235 RunAlgorithm(ga); 236 Assert.AreEqual(0.84 966698918060757, GetDoubleResult(ga, "BestQuality"), 1E-8);237 Assert.AreEqual(0.5 9815405391256571, GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);236 Assert.AreEqual(0.847170741142629, GetDoubleResult(ga, "BestQuality"), 1E-8); 237 Assert.AreEqual(0.58487147022708, GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8); 238 238 Assert.AreEqual(0, GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8); 239 239 Assert.AreEqual(50950, GetIntResult(ga, "EvaluatedSolutions"));
Note: See TracChangeset
for help on using the changeset viewer.