- Timestamp:
- 11/19/15 19:39:07 (9 years ago)
- Location:
- stable
- Files:
-
- 13 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 13241,13300,13307
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression merged eligible /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 merged eligible /branches/Benchmarking/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 6917-7005 /branches/Benchmarking/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 6917-7005 /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 4656-4721 /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 4656-4721 /branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5471-5473 /branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5471-5473 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5815-6180 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5815-6180 /branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 10750-13239 /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 4458-4459,4462,4464 /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 4458-4459,4462,4464 /branches/DataPreprocessing/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 10085-11101 /branches/DataPreprocessing/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 10085-11101 /branches/GP.Grammar.Editor/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 6284-6795 /branches/GP.Grammar.Editor/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 6284-6795 /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5060 /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5060 /branches/HLScript/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 10331-10358 /branches/HLScript/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 10331-10358 /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 11570-12508 /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 11130-12721 /branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 8388-8942 /branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 8388-8942 /branches/LogResidualEvaluator/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 10202-10483 /branches/LogResidualEvaluator/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 10202-10483 /branches/NET40/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5138-5162 /branches/NET40/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5138-5162 /branches/ParallelEngine/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5175-5192 /branches/ParallelEngine/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5175-5192 /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 7748-7810 /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 7748-7810 /branches/QAPAlgorithms/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 6350-6627 /branches/QAPAlgorithms/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 6350-6627 /branches/Restructure trunk solution/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 6828 /branches/Restructure trunk solution/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 6828 /branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 10204-10479 /branches/SpectralKernelForGaussianProcesses/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 10204-10479 /branches/SuccessProgressAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5370-5682 /branches/SuccessProgressAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5370-5682 /branches/SymbolicExpressionTreeDiversityAnalyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 12029-12100 /branches/SymbolicExpressionTreeEncoding/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 12336-12421 /branches/Trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 6829-6865 /branches/Trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 6829-6865 /branches/VNS/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5594-5752 /branches/VNS/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5594-5752 /branches/histogram/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression 5959-6341 /branches/histogram/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4 5959-6341
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj
r12281 r13310 123 123 </ItemGroup> 124 124 <ItemGroup> 125 <Compile Include="MultiObjective\PearsonRSquaredNestedTreeSizeEvaluator.cs" /> 126 <Compile Include="MultiObjective\PearsonRSquaredNumberOfVariablesEvaluator.cs" /> 127 <Compile Include="MultiObjective\PearsonRSquaredTreeComplexityEvaluator.cs" /> 125 128 <Compile Include="MultiObjective\SymbolicRegressionMultiObjectiveValidationBestSolutionAnalyzer.cs" /> 126 129 <Compile Include="Plugin.cs" /> -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredNestedTreeSizeEvaluator.cs
r13241 r13310 44 44 public PearsonRSquaredNestedTreeSizeEvaluator() : base() { } 45 45 46 public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } } 46 public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } } // maximize R² & minimize nested tree size 47 47 48 48 public override IOperation InstrumentedApply() { … … 67 67 if (decimalPlaces >= 0) 68 68 r2 = Math.Round(r2, decimalPlaces); 69 return new double[2] { r2, solution.IterateNodesPostfix().Sum(n => n.GetLength()) }; 69 return new double[2] { r2, solution.IterateNodesPostfix().Sum(n => n.GetLength()) }; // sum of the length of the whole sub-tree for each node 70 70 } 71 71 … … 74 74 EstimationLimitsParameter.ExecutionContext = context; 75 75 ApplyLinearScalingParameter.ExecutionContext = context; 76 // DecimalPlaces parameter is a FixedValueParameter and doesn't need the context. 76 77 77 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 78 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 78 79 79 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredNumberOfVariablesEvaluator.cs
r13241 r13310 44 44 public PearsonRSquaredNumberOfVariablesEvaluator() : base() { } 45 45 46 public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } } 46 public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } } // maximize R² and minimize the number of variables 47 47 48 48 public override IOperation InstrumentedApply() { … … 66 66 if (decimalPlaces >= 0) 67 67 r2 = Math.Round(r2, decimalPlaces); 68 return new double[2] { r2, solution.IterateNodesPostfix().OfType<VariableTreeNode>().Count() }; 68 return new double[2] { r2, solution.IterateNodesPostfix().OfType<VariableTreeNode>().Count() }; // count the number of variables 69 69 } 70 70 … … 73 73 EstimationLimitsParameter.ExecutionContext = context; 74 74 ApplyLinearScalingParameter.ExecutionContext = context; 75 // DecimalPlaces parameter is a FixedValueParameter and doesn't need the context. 75 76 76 77 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredTreeComplexityEvaluator.cs
r13241 r13310 43 43 public PearsonRSquaredTreeComplexityEvaluator() : base() { } 44 44 45 public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } } 45 public override IEnumerable<bool> Maximization { get { return new bool[2] { true, false }; } } // maximize R² and minimize model complexity 46 46 47 47 public override IOperation InstrumentedApply() { … … 72 72 EstimationLimitsParameter.ExecutionContext = context; 73 73 ApplyLinearScalingParameter.ExecutionContext = context; 74 // DecimalPlaces parameter is a FixedValueParameter and doesn't need the context. 74 75 75 76 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveEvaluator.cs
r12009 r13310 22 22 23 23 using HeuristicLab.Common; 24 using HeuristicLab.Core; 25 using HeuristicLab.Data; 26 using HeuristicLab.Parameters; 24 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 25 29 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { 30 [StorableClass] 26 31 public abstract class SymbolicRegressionMultiObjectiveEvaluator : SymbolicDataAnalysisMultiObjectiveEvaluator<IRegressionProblemData>, ISymbolicRegressionMultiObjectiveEvaluator { 32 private const string DecimalPlacesParameterName = "Decimal Places"; 33 private const string UseConstantOptimizationParameterName = "Use constant optimization"; 34 private const string ConstantOptimizationIterationsParameterName = "Constant optimization iterations"; 35 36 public IFixedValueParameter<IntValue> DecimalPlacesParameter { 37 get { return (IFixedValueParameter<IntValue>)Parameters[DecimalPlacesParameterName]; } 38 } 39 public IFixedValueParameter<BoolValue> UseConstantOptimizationParameter { 40 get { return (IFixedValueParameter<BoolValue>)Parameters[UseConstantOptimizationParameterName]; } 41 } 42 43 public IFixedValueParameter<IntValue> ConstantOptimizationIterationsParameter { 44 get { return (IFixedValueParameter<IntValue>)Parameters[ConstantOptimizationIterationsParameterName]; } 45 } 46 47 48 public int DecimalPlaces { 49 get { return DecimalPlacesParameter.Value.Value; } 50 set { DecimalPlacesParameter.Value.Value = value; } 51 } 52 public bool UseConstantOptimization { 53 get { return UseConstantOptimizationParameter.Value.Value; } 54 set { UseConstantOptimizationParameter.Value.Value = value; } 55 } 56 public int ConstantOptimizationIterations { 57 get { return ConstantOptimizationIterationsParameter.Value.Value; } 58 set { ConstantOptimizationIterationsParameter.Value.Value = value; } 59 } 60 27 61 [StorableConstructor] 28 62 protected SymbolicRegressionMultiObjectiveEvaluator(bool deserializing) : base(deserializing) { } … … 31 65 } 32 66 33 protected SymbolicRegressionMultiObjectiveEvaluator() : base() { } 67 protected SymbolicRegressionMultiObjectiveEvaluator() 68 : base() { 69 Parameters.Add(new FixedValueParameter<IntValue>(DecimalPlacesParameterName, "The number of decimal places used for rounding the quality values.", new IntValue(5)) { Hidden = true }); 70 Parameters.Add(new FixedValueParameter<BoolValue>(UseConstantOptimizationParameterName, "", new BoolValue(false))); 71 Parameters.Add(new FixedValueParameter<IntValue>(ConstantOptimizationIterationsParameterName, "The number of iterations constant optimization should be applied.", new IntValue(5))); 72 } 73 74 [StorableHook(HookType.AfterDeserialization)] 75 private void AfterDeserialization() { 76 if (!Parameters.ContainsKey(UseConstantOptimizationParameterName)) { 77 Parameters.Add(new FixedValueParameter<BoolValue>(UseConstantOptimizationParameterName, "", new BoolValue(false))); 78 } 79 if (!Parameters.ContainsKey(DecimalPlacesParameterName)) { 80 Parameters.Add(new FixedValueParameter<IntValue>(DecimalPlacesParameterName, "The number of decimal places used for rounding the quality values.", new IntValue(-1)) { Hidden = true }); 81 } 82 if (!Parameters.ContainsKey(ConstantOptimizationIterationsParameterName)) { 83 Parameters.Add(new FixedValueParameter<IntValue>(ConstantOptimizationIterationsParameterName, "The number of iterations constant optimization should be applied.", new IntValue(5))); 84 } 85 } 34 86 } 35 87 } -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
r12009 r13310 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[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 var problemData = ProblemDataParameter.ActualValue; 51 var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; 52 var estimationLimits = EstimationLimitsParameter.ActualValue; 53 var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value; 54 55 if (UseConstantOptimization) { 56 SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows, applyLinearScaling, ConstantOptimizationIterations, estimationLimits.Upper, estimationLimits.Lower); 57 } 58 59 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 50 60 QualitiesParameter.ActualValue = new DoubleArray(qualities); 51 61 return base.InstrumentedApply(); 52 62 } 53 63 54 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 OnlineCalculatorError errorState; 64 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 65 var mse = SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.Calculate(interpreter, solution, lowerEstimationLimit, 66 upperEstimationLimit, problemData, rows, applyLinearScaling); 58 67 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 } 69 if (errorState != OnlineCalculatorError.None) mse = double.NaN; 68 if (decimalPlaces >= 0) 69 mse = Math.Round(mse, decimalPlaces); 70 70 71 return new double[2] { mse, solution.Length }; 71 72 } … … 76 77 ApplyLinearScalingParameter.ExecutionContext = context; 77 78 78 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value );79 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 79 80 80 81 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
r12669 r13310 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[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 var problemData = ProblemDataParameter.ActualValue; 51 var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; 52 var estimationLimits = EstimationLimitsParameter.ActualValue; 53 var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value; 54 55 if (UseConstantOptimization) { 56 SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows, applyLinearScaling, ConstantOptimizationIterations, estimationLimits.Upper, estimationLimits.Lower); 57 } 58 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 50 59 QualitiesParameter.ActualValue = new DoubleArray(qualities); 51 60 return base.InstrumentedApply(); 52 61 } 53 62 54 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 OnlineCalculatorError errorState; 58 59 double r; 60 if (applyLinearScaling) { 61 var rCalculator = new OnlinePearsonsRCalculator(); 62 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, rCalculator, problemData.Dataset.Rows); 63 errorState = rCalculator.ErrorState; 64 r = rCalculator.R; 65 } else { 66 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 67 r = OnlinePearsonsRCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 68 } 69 70 if (errorState != OnlineCalculatorError.None) r = double.NaN; 71 return new double[2] { r*r, solution.Length }; 63 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 64 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling); 65 if (decimalPlaces >= 0) 66 r2 = Math.Round(r2, decimalPlaces); 67 return new double[2] { r2, solution.Length }; 72 68 } 73 69 … … 77 73 ApplyLinearScalingParameter.ExecutionContext = context; 78 74 79 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value );75 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 80 76 81 77 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveTrainingBestSolutionAnalyzer.cs
r12009 r13310 20 20 #endregion 21 21 22 using System.Collections.Generic; 23 using System.Linq; 24 using HeuristicLab.Analysis; 22 25 using HeuristicLab.Common; 23 26 using HeuristicLab.Core; 27 using HeuristicLab.Data; 24 28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 29 using HeuristicLab.Optimization; 25 30 using HeuristicLab.Parameters; 26 31 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 37 42 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 38 43 private const string EstimationLimitsParameterName = "EstimationLimits"; 44 private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength"; 45 private const string ValidationPartitionParameterName = "ValidationPartition"; 46 39 47 #region parameter properties 40 48 public ILookupParameter<IRegressionProblemData> ProblemDataParameter { … … 47 55 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 48 56 } 57 public ILookupParameter<IntValue> MaximumSymbolicExpressionTreeLengthParameter { 58 get { return (ILookupParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeLengthParameterName]; } 59 } 60 61 public IValueLookupParameter<IntRange> ValidationPartitionParameter { 62 get { return (IValueLookupParameter<IntRange>)Parameters[ValidationPartitionParameterName]; } 63 } 49 64 #endregion 50 65 … … 54 69 public SymbolicRegressionMultiObjectiveTrainingBestSolutionAnalyzer() 55 70 : base() { 56 Parameters.Add(new LookupParameter<IRegressionProblemData>(ProblemDataParameterName, "The problem data for the symbolic regression solution.")); 57 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 58 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.")); 71 Parameters.Add(new LookupParameter<IRegressionProblemData>(ProblemDataParameterName, "The problem data for the symbolic regression solution.") { Hidden = true }); 72 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.") { Hidden = true }); 73 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.") { Hidden = true }); 74 Parameters.Add(new LookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, "Maximal length of the symbolic expression.") { Hidden = true }); 75 Parameters.Add(new ValueLookupParameter<IntRange>(ValidationPartitionParameterName, "The validation partition.")); 76 } 77 78 [StorableHook(HookType.AfterDeserialization)] 79 private void AfterDeserialization() { 80 if (!Parameters.ContainsKey(MaximumSymbolicExpressionTreeLengthParameterName)) 81 Parameters.Add(new LookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, "Maximal length of the symbolic expression.") { Hidden = true }); 82 if (!Parameters.ContainsKey(ValidationPartitionParameterName)) 83 Parameters.Add(new ValueLookupParameter<IntRange>(ValidationPartitionParameterName, "The validation partition.")); 59 84 } 60 85 … … 68 93 return new SymbolicRegressionSolution(model, (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone()); 69 94 } 95 96 public override IOperation Apply() { 97 var operation = base.Apply(); 98 var paretoFront = TrainingBestSolutionsParameter.ActualValue; 99 100 IResult result; 101 ScatterPlot qualityToTreeSize; 102 if (!ResultCollection.TryGetValue("Pareto Front Analysis", out result)) { 103 qualityToTreeSize = new ScatterPlot("Quality vs Tree Size", ""); 104 qualityToTreeSize.VisualProperties.XAxisMinimumAuto = false; 105 qualityToTreeSize.VisualProperties.XAxisMaximumAuto = false; 106 qualityToTreeSize.VisualProperties.YAxisMinimumAuto = false; 107 qualityToTreeSize.VisualProperties.YAxisMaximumAuto = false; 108 109 qualityToTreeSize.VisualProperties.XAxisMinimumFixedValue = 0; 110 qualityToTreeSize.VisualProperties.XAxisMaximumFixedValue = MaximumSymbolicExpressionTreeLengthParameter.ActualValue.Value; 111 qualityToTreeSize.VisualProperties.YAxisMinimumFixedValue = 0; 112 qualityToTreeSize.VisualProperties.YAxisMaximumFixedValue = 2; 113 ResultCollection.Add(new Result("Pareto Front Analysis", qualityToTreeSize)); 114 } else { 115 qualityToTreeSize = (ScatterPlot)result.Value; 116 } 117 118 119 int previousTreeLength = -1; 120 var sizeParetoFront = new LinkedList<ISymbolicRegressionSolution>(); 121 foreach (var solution in paretoFront.OrderBy(s => s.Model.SymbolicExpressionTree.Length)) { 122 int treeLength = solution.Model.SymbolicExpressionTree.Length; 123 if (!sizeParetoFront.Any()) sizeParetoFront.AddLast(solution); 124 if (solution.TrainingNormalizedMeanSquaredError < sizeParetoFront.Last.Value.TrainingNormalizedMeanSquaredError) { 125 if (treeLength == previousTreeLength) 126 sizeParetoFront.RemoveLast(); 127 sizeParetoFront.AddLast(solution); 128 } 129 previousTreeLength = treeLength; 130 } 131 132 qualityToTreeSize.Rows.Clear(); 133 var trainingRow = new ScatterPlotDataRow("Training NMSE", "", sizeParetoFront.Select(x => new Point2D<double>(x.Model.SymbolicExpressionTree.Length, x.TrainingNormalizedMeanSquaredError))); 134 trainingRow.VisualProperties.PointSize = 8; 135 qualityToTreeSize.Rows.Add(trainingRow); 136 137 var validationPartition = ValidationPartitionParameter.ActualValue; 138 if (validationPartition.Size != 0) { 139 var problemData = ProblemDataParameter.ActualValue; 140 var validationIndizes = Enumerable.Range(validationPartition.Start, validationPartition.Size).ToList(); 141 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, validationIndizes).ToList(); 142 OnlineCalculatorError error; 143 var validationRow = new ScatterPlotDataRow("Validation NMSE", "", 144 sizeParetoFront.Select(x => new Point2D<double>(x.Model.SymbolicExpressionTree.Length, 145 OnlineNormalizedMeanSquaredErrorCalculator.Calculate(targetValues, x.GetEstimatedValues(validationIndizes), out error)))); 146 validationRow.VisualProperties.PointSize = 7; 147 qualityToTreeSize.Rows.Add(validationRow); 148 } 149 150 return operation; 151 } 152 70 153 } 71 154 } -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs
r12702 r13310 164 164 165 165 166 // TODO: swap positions of lowerEstimationLimit and upperEstimationLimit parameters 166 167 public static double OptimizeConstants(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, IRegressionProblemData problemData, 167 168 IEnumerable<int> rows, bool applyLinearScaling, int maxIterations, double upperEstimationLimit = double.MaxValue, double lowerEstimationLimit = double.MinValue, bool updateConstantsInTree = true) { -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSolution.cs
r12009 r13310 118 118 estimationLimitResults.Add(new Result(TestNaNEvaluationsResultName, "", new IntValue())); 119 119 Add(new Result(EstimationLimitsResultsResultName, "Results concerning the estimation limits of symbolic regression solution", estimationLimitResults)); 120 121 120 RecalculateResults(); 122 121 } -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveTrainingBestSolutionAnalyzer.cs
r12009 r13310 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using System.Linq; … … 42 41 private const string TrainingBestSolutionQualitiesParameterName = "Best training solution qualities"; 43 42 private const string UpdateAlwaysParameterName = "Always update best solutions"; 43 private const string TrainingBestSolutionParameterName = "Best training solution"; 44 44 45 45 #region parameter properties … … 55 55 #endregion 56 56 #region properties 57 p ublicItemList<T> TrainingBestSolutions {57 private ItemList<T> TrainingBestSolutions { 58 58 get { return TrainingBestSolutionsParameter.ActualValue; } 59 59 set { TrainingBestSolutionsParameter.ActualValue = value; } 60 60 } 61 p ublicItemList<DoubleArray> TrainingBestSolutionQualities {61 private ItemList<DoubleArray> TrainingBestSolutionQualities { 62 62 get { return TrainingBestSolutionQualitiesParameter.ActualValue; } 63 63 set { TrainingBestSolutionQualitiesParameter.ActualValue = value; } 64 64 } 65 public BoolValue UpdateAlways { 66 get { return UpdateAlwaysParameter.Value; } 65 public bool UpdateAlways { 66 get { return UpdateAlwaysParameter.Value.Value; } 67 set { UpdateAlwaysParameter.Value.Value = value; } 67 68 } 68 69 #endregion … … 97 98 } 98 99 100 if (!results.ContainsKey(TrainingBestSolutionParameterName)) { 101 results.Add(new Result(TrainingBestSolutionParameterName, "", typeof(ISymbolicDataAnalysisSolution))); 102 } 103 99 104 //if the pareto front of best solutions shall be updated regardless of the quality, the list initialized empty to discard old solutions 100 IList<double[]> trainingBestQualities;101 if (UpdateAlways .Value) {105 List<double[]> trainingBestQualities; 106 if (UpdateAlways) { 102 107 trainingBestQualities = new List<double[]>(); 103 108 } else { … … 105 110 } 106 111 107 #region find best trees 108 IList<int> nonDominatedIndexes = new List<int>(); 109 ISymbolicExpressionTree[] tree = SymbolicExpressionTree.ToArray(); 112 ISymbolicExpressionTree[] trees = SymbolicExpressionTree.ToArray(); 110 113 List<double[]> qualities = Qualities.Select(x => x.ToArray()).ToList(); 111 114 bool[] maximization = Maximization.ToArray(); 112 List<double[]> newNonDominatedQualities = new List<double[]>(); 113 for (int i = 0; i < tree.Length; i++) { 114 if (IsNonDominated(qualities[i], trainingBestQualities, maximization) && 115 IsNonDominated(qualities[i], qualities, maximization)) { 116 if (!newNonDominatedQualities.Contains(qualities[i], new DoubleArrayComparer())) { 117 newNonDominatedQualities.Add(qualities[i]); 118 nonDominatedIndexes.Add(i); 115 116 var nonDominatedIndividuals = new[] { new { Tree = default(ISymbolicExpressionTree), Qualities = default(double[]) } }.ToList(); 117 nonDominatedIndividuals.Clear(); 118 119 // build list of new non-dominated solutions 120 for (int i = 0; i < trees.Length; i++) { 121 if (IsNonDominated(qualities[i], nonDominatedIndividuals.Select(ind => ind.Qualities), maximization) && 122 IsNonDominated(qualities[i], trainingBestQualities, maximization)) { 123 for (int j = nonDominatedIndividuals.Count - 1; j >= 0; j--) { 124 if (IsBetterOrEqual(qualities[i], nonDominatedIndividuals[j].Qualities, maximization)) { 125 nonDominatedIndividuals.RemoveAt(j); 126 } 119 127 } 128 nonDominatedIndividuals.Add(new { Tree = trees[i], Qualities = qualities[i] }); 120 129 } 121 130 } 122 #endregion 131 132 var nonDominatedSolutions = nonDominatedIndividuals.Select(x => new { Solution = CreateSolution(x.Tree, x.Qualities), Qualities = x.Qualities }).ToList(); 133 nonDominatedSolutions.ForEach(s => s.Solution.Name = string.Join(",", s.Qualities.Select(q => q.ToString()))); 134 123 135 #region update Pareto-optimal solution archive 124 if (nonDominatedIndexes.Count > 0) { 125 ItemList<DoubleArray> nonDominatedQualities = new ItemList<DoubleArray>(); 126 ItemList<T> nonDominatedSolutions = new ItemList<T>(); 127 // add all new non-dominated solutions to the archive 128 foreach (var index in nonDominatedIndexes) { 129 T solution = CreateSolution(tree[index], qualities[index]); 130 nonDominatedSolutions.Add(solution); 131 nonDominatedQualities.Add(new DoubleArray(qualities[index])); 132 } 133 // add old non-dominated solutions only if they are not dominated by one of the new solutions 136 if (nonDominatedSolutions.Count > 0) { 137 //add old non-dominated solutions only if they are not dominated by one of the new solutions 134 138 for (int i = 0; i < trainingBestQualities.Count; i++) { 135 if (IsNonDominated(trainingBestQualities[i], newNonDominatedQualities, maximization)) { 136 if (!newNonDominatedQualities.Contains(trainingBestQualities[i], new DoubleArrayComparer())) { 137 nonDominatedSolutions.Add(TrainingBestSolutions[i]); 138 nonDominatedQualities.Add(TrainingBestSolutionQualities[i]); 139 } 139 if (IsNonDominated(trainingBestQualities[i], nonDominatedSolutions.Select(x => x.Qualities), maximization)) { 140 nonDominatedSolutions.Add(new { Solution = TrainingBestSolutions[i], Qualities = TrainingBestSolutionQualities[i].ToArray() }); 140 141 } 141 142 } 142 143 143 results[TrainingBestSolutionsParameter.Name].Value = nonDominatedSolutions; 144 results[TrainingBestSolutionQualitiesParameter.Name].Value = nonDominatedQualities; 144 //assumes the the first objective is always the accuracy 145 var sortedNonDominatedSolutions = maximization[0] 146 ? nonDominatedSolutions.OrderByDescending(x => x.Qualities[0]) 147 : nonDominatedSolutions.OrderBy(x => x.Qualities[0]); 148 var trainingBestSolution = sortedNonDominatedSolutions.Select(s => s.Solution).First(); 149 results[TrainingBestSolutionParameterName].Value = trainingBestSolution; 150 TrainingBestSolutions = new ItemList<T>(sortedNonDominatedSolutions.Select(x => x.Solution)); 151 results[TrainingBestSolutionsParameter.Name].Value = TrainingBestSolutions; 152 TrainingBestSolutionQualities = new ItemList<DoubleArray>(sortedNonDominatedSolutions.Select(x => new DoubleArray(x.Qualities))); 153 results[TrainingBestSolutionQualitiesParameter.Name].Value = TrainingBestSolutionQualities; 145 154 } 146 155 #endregion … … 148 157 } 149 158 150 private class DoubleArrayComparer : IEqualityComparer<double[]> {151 public bool Equals(double[] x, double[] y) {152 if (y.Length != x.Length) throw new ArgumentException();153 for (int i = 0; i < x.Length; i++) {154 if (!x[i].IsAlmost(y[i])) return false;155 }156 return true;157 }158 159 public int GetHashCode(double[] obj) {160 int c = obj.Length;161 for (int i = 0; i < obj.Length; i++)162 c ^= obj[i].GetHashCode();163 return c;164 }165 }166 167 159 protected abstract T CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQuality); 168 160 169 private bool IsNonDominated(double[] point, I List<double[]> points, bool[] maximization) {161 private bool IsNonDominated(double[] point, IEnumerable<double[]> points, bool[] maximization) { 170 162 foreach (var refPoint in points) { 171 bool refPointDominatesPoint = true; 172 for (int i = 0; i < point.Length; i++) { 173 refPointDominatesPoint &= IsBetterOrEqual(refPoint[i], point[i], maximization[i]); 174 } 163 bool refPointDominatesPoint = IsBetterOrEqual(refPoint, point, maximization); 175 164 if (refPointDominatesPoint) return false; 176 165 } 177 166 return true; 178 167 } 168 169 private bool IsBetterOrEqual(double[] lhs, double[] rhs, bool[] maximization) { 170 for (int i = 0; i < lhs.Length; i++) { 171 var result = IsBetterOrEqual(lhs[i], rhs[i], maximization[i]); 172 if (!result) return false; 173 } 174 return true; 175 } 176 179 177 private bool IsBetterOrEqual(double lhs, double rhs, bool maximization) { 180 if (maximization) return lhs > rhs;181 else return lhs < rhs;178 if (maximization) return lhs >= rhs; 179 else return lhs <= rhs; 182 180 } 183 181 } -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
r13047 r13310 138 138 <Compile Include="Importer\Token.cs" /> 139 139 <Compile Include="Interfaces\IModelBacktransformator.cs" /> 140 <Compile Include="SymbolicDataAnalysisExpressionTreeSimplificationOperator.cs" /> 141 <Compile Include="SymbolicDataAnalysisModelComplexityCalculator.cs" /> 140 142 <Compile Include="SymbolicExpressionTreeBacktransformator.cs" /> 141 143 <Compile Include="SymbolicDataAnalysisExpressionPruningOperator.cs" /> -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplificationOperator.cs
r13241 r13310 28 28 29 29 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { 30 [Item("SymbolicExpressionTreeSimplificationOperator", "Simpl fies symbolic expression trees encoding a mathematical formula.")]30 [Item("SymbolicExpressionTreeSimplificationOperator", "Simplifies symbolic expression trees encoding a mathematical formula.")] 31 31 [StorableClass] 32 32 public class SymbolicDataAnalysisExpressionTreeSimplificationOperator : SingleSuccessorOperator, ISymbolicExpressionTreeOperator { -
stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisModelComplexityCalculator.cs
r13241 r13310 42 42 return 2; 43 43 } 44 case OpCodes.Add: { 45 double complexity = 0; 46 for (int i = 0; i < node.SubtreeCount; i++) { 47 complexity += CalculateComplexity(node.GetSubtree(i)); 48 } 49 return complexity; 50 } 44 case OpCodes.Add: 51 45 case OpCodes.Sub: { 52 46 double complexity = 0; … … 56 50 return complexity; 57 51 } 58 case OpCodes.Mul: { 59 double complexity = 1; 60 for (int i = 0; i < node.SubtreeCount; i++) { 61 var nodeComplexity = CalculateComplexity(node.GetSubtree(i)); 62 complexity *= nodeComplexity + 1; 63 } 64 return complexity; 65 } 52 case OpCodes.Mul: 66 53 case OpCodes.Div: { 67 54 double complexity = 1; … … 72 59 return complexity; 73 60 } 74 case OpCodes.Sin: { 75 double complexity = CalculateComplexity(node.GetSubtree(0)); 76 return Math.Pow(2.0, complexity); 77 } 78 case OpCodes.Cos: { 79 double complexity = CalculateComplexity(node.GetSubtree(0)); 80 return Math.Pow(2.0, complexity); 81 } 82 case OpCodes.Tan: { 83 double complexity = CalculateComplexity(node.GetSubtree(0)); 84 return Math.Pow(2.0, complexity); 85 } 86 case OpCodes.Exp: { 87 double complexity = CalculateComplexity(node.GetSubtree(0)); 88 return Math.Pow(2.0, complexity); 89 } 61 case OpCodes.Sin: 62 case OpCodes.Cos: 63 case OpCodes.Tan: 64 case OpCodes.Exp: 90 65 case OpCodes.Log: { 91 66 double complexity = CalculateComplexity(node.GetSubtree(0)); … … 100 75 return complexity * complexity * complexity; 101 76 } 102 case OpCodes.Power: { 77 case OpCodes.Power: 78 case OpCodes.Root: { 103 79 double complexity = CalculateComplexity(node.GetSubtree(0)); 104 var exponent Node= node.GetSubtree(1) as ConstantTreeNode;105 if (exponent Node!= null) {106 double exp onent = exponentNode.Value;107 if (exp onent < 0) exponent = Math.Abs(exponent);108 if (exp onent < 1) exponent = 1 / exponent;109 return Math.Pow(complexity, Math.Round(exp onent));80 var exponent = node.GetSubtree(1) as ConstantTreeNode; 81 if (exponent != null) { 82 double expVal = exponent.Value; 83 if (expVal < 0) expVal = Math.Abs(expVal); 84 if (expVal < 1) expVal = 1 / expVal; 85 return Math.Pow(complexity, Math.Round(expVal)); 110 86 } 111 87 112 double exponentComplexity = CalculateComplexity(node.GetSubtree(1)); 113 return Math.Pow(complexity, 2 * exponentComplexity); 114 } 115 case OpCodes.Root: { 116 double complexity = CalculateComplexity(node.GetSubtree(0)); 117 var rootNode = node.GetSubtree(1) as ConstantTreeNode; 118 if (rootNode != null) { 119 double root = rootNode.Value; 120 if (root < 0) root = Math.Abs(root); 121 if (root < 1) root = 1 / root; 122 return Math.Pow(complexity, Math.Round(root)); 123 } 124 125 double rootComplexity = CalculateComplexity(node.GetSubtree(1)); 126 return Math.Pow(complexity, 2 * rootComplexity); 88 double expComplexity = CalculateComplexity(node.GetSubtree(1)); 89 return Math.Pow(complexity, 2 * expComplexity); 127 90 } 128 91
Note: See TracChangeset
for help on using the changeset viewer.