- Timestamp:
- 02/24/22 20:33:45 (3 years ago)
- Location:
- trunk
- Files:
-
- 22 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj
r18210 r18220 47 47 <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 48 48 <Prefer32Bit>false</Prefer32Bit> 49 <LangVersion>default</LangVersion> 49 50 </PropertyGroup> 50 51 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> … … 57 58 <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 58 59 <Prefer32Bit>false</Prefer32Bit> 60 <LangVersion>default</LangVersion> 59 61 </PropertyGroup> 60 62 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' "> … … 67 69 <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 68 70 <Prefer32Bit>false</Prefer32Bit> 71 <LangVersion>default</LangVersion> 69 72 </PropertyGroup> 70 73 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' "> … … 77 80 <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 78 81 <Prefer32Bit>false</Prefer32Bit> 82 <LangVersion>default</LangVersion> 79 83 </PropertyGroup> 80 84 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> … … 87 91 <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 88 92 <Prefer32Bit>false</Prefer32Bit> 93 <LangVersion>default</LangVersion> 89 94 </PropertyGroup> 90 95 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> … … 97 102 <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 98 103 <Prefer32Bit>false</Prefer32Bit> 104 <LangVersion>default</LangVersion> 99 105 </PropertyGroup> 100 106 <ItemGroup> … … 127 133 <Compile Include="MultiObjective\ShapeConstrainedRegressionMultiObjectiveProblem.cs" /> 128 134 <Compile Include="MultiObjective\SymbolicRegressionMultiObjectiveValidationBestSolutionAnalyzer.cs" /> 135 <Compile Include="ParameterOptimization.cs" /> 129 136 <Compile Include="Plugin.cs" /> 130 137 <Compile Include="ShapeConstraintsAnalyzer.cs" /> … … 135 142 <Compile Include="SingleObjective\SolutionQualityAnalyzer.cs" /> 136 143 <Compile Include="SingleObjective\SolutionRSquaredAnalyzer.cs" /> 144 <Compile Include="SingleObjective\StructureTemplateSymbolicRegressionProblem.cs" /> 137 145 <Compile Include="SymbolicRegressionPhenotypicDiversityAnalyzer.cs" /> 138 146 <Compile Include="SymbolicRegressionPruningAnalyzer.cs" /> … … 212 220 <Private>False</Private> 213 221 </ProjectReference> 222 <ProjectReference Include="..\..\HeuristicLab.Encodings.RealVectorEncoding\3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj"> 223 <Project>{BB6D334A-4BB6-4674-9883-31A6EBB32CAB}</Project> 224 <Name>HeuristicLab.Encodings.RealVectorEncoding-3.3</Name> 225 </ProjectReference> 214 226 <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj"> 215 227 <Project>{06D4A186-9319-48A0-BADE-A2058D462EEA}</Project> … … 257 269 <Private>False</Private> 258 270 </ProjectReference> 271 <ProjectReference Include="..\..\HeuristicLab.Problems.Instances.DataAnalysis\3.3\HeuristicLab.Problems.Instances.DataAnalysis-3.3.csproj"> 272 <Project>{94C7714E-29D4-4D6D-B213-2C18D627AB75}</Project> 273 <Name>HeuristicLab.Problems.Instances.DataAnalysis-3.3</Name> 274 </ProjectReference> 259 275 <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj"> 260 276 <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project> 261 277 <Name>HeuristicLab.Problems.Instances-3.3</Name> 262 278 <Private>False</Private> 279 </ProjectReference> 280 <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj"> 281 <Project>{f4539fb6-4708-40c9-be64-0a1390aea197}</Project> 282 <Name>HeuristicLab.Random-3.3</Name> 263 283 </ProjectReference> 264 284 </ItemGroup> -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Interfaces/ISymbolicRegressionSingleObjectiveEvaluator.cs
r17180 r18220 1 using HEAL.Attic; 1 using System.Collections.Generic; 2 using System.Linq; 3 using HEAL.Attic; 4 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 2 5 #region License Information 3 6 /* HeuristicLab … … 24 27 [StorableType("5dd2601a-b884-48c0-85bc-bc1f437187a3")] 25 28 public interface ISymbolicRegressionSingleObjectiveEvaluator : ISymbolicRegressionEvaluator, ISymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData> { 29 double Evaluate( 30 ISymbolicExpressionTree tree, 31 IRegressionProblemData problemData, 32 IEnumerable<int> rows, 33 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 34 bool applyLinearScaling = true, 35 double lowerEstimationLimit = double.MinValue, 36 double upperEstimationLimit = double.MaxValue); 26 37 } 27 38 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredAverageSimilarityEvaluator.cs
r18132 r18220 70 70 public override IOperation InstrumentedApply() { 71 71 IEnumerable<int> rows = GenerateRowsToEvaluate(); 72 var solution= SymbolicExpressionTreeParameter.ActualValue;72 var tree = SymbolicExpressionTreeParameter.ActualValue; 73 73 var problemData = ProblemDataParameter.ActualValue; 74 74 var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; … … 77 77 78 78 if (UseParameterOptimization) { 79 SymbolicRegressionParameterOptimizationEvaluator.OptimizeParameters(interpreter, solution, problemData, rows, applyLinearScaling, ParameterOptimizationIterations, updateVariableWeights: ParameterOptimizationUpdateVariableWeights, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper);79 SymbolicRegressionParameterOptimizationEvaluator.OptimizeParameters(interpreter, tree, problemData, rows, applyLinearScaling, ParameterOptimizationIterations, updateVariableWeights: ParameterOptimizationUpdateVariableWeights, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper); 80 80 } 81 81 82 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, estimationLimits.Lower, estimationLimits.Upper, problemData, rows, applyLinearScaling); 82 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 83 tree, problemData, rows, interpreter, applyLinearScaling, 84 estimationLimits.Lower, estimationLimits.Upper); 83 85 84 86 if (DecimalPlaces >= 0) … … 107 109 var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value; 108 110 109 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, estimationLimits.Lower, estimationLimits.Upper, problemData, rows, applyLinearScaling); 111 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 112 tree, problemData, rows, 113 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 114 applyLinearScaling, 115 estimationLimits.Lower, estimationLimits.Upper); 110 116 111 117 lock (locker) { -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredNestedTreeSizeEvaluator.cs
r18132 r18220 63 63 } 64 64 65 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 66 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling); 65 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 66 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 67 tree, problemData, rows, 68 interpreter, applyLinearScaling, 69 lowerEstimationLimit, upperEstimationLimit); 67 70 if (decimalPlaces >= 0) 68 71 r2 = Math.Round(r2, decimalPlaces); 69 return new double[2] { r2, solution.IterateNodesPostfix().Sum(n => n.GetLength()) }; // sum of the length of the whole sub-tree for each node72 return new double[2] { r2, tree.IterateNodesPostfix().Sum(n => n.GetLength()) }; // sum of the length of the whole sub-tree for each node 70 73 } 71 74 -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredNumberOfVariablesEvaluator.cs
r18132 r18220 62 62 } 63 63 64 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 65 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling); 64 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 65 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 66 tree, problemData, rows, interpreter, applyLinearScaling, 67 lowerEstimationLimit, upperEstimationLimit); 66 68 if (decimalPlaces >= 0) 67 69 r2 = Math.Round(r2, decimalPlaces); 68 return new double[2] { r2, solution.IterateNodesPostfix().OfType<IVariableTreeNode>().Count() }; // count the number of variables70 return new double[2] { r2, tree.IterateNodesPostfix().OfType<IVariableTreeNode>().Count() }; // count the number of variables 69 71 } 70 72 -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/PearsonRSquaredTreeComplexityEvaluator.cs
r18132 r18220 61 61 } 62 62 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); 63 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 64 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 65 tree, problemData, rows, 66 interpreter, applyLinearScaling, 67 lowerEstimationLimit, upperEstimationLimit); 65 68 if (decimalPlaces >= 0) 66 69 r2 = Math.Round(r2, decimalPlaces); 67 return new double[2] { r2, SymbolicDataAnalysisModelComplexityCalculator.CalculateComplexity( solution) };70 return new double[2] { r2, SymbolicDataAnalysisModelComplexityCalculator.CalculateComplexity(tree) }; 68 71 } 69 72 -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
r18132 r18220 22 22 using System; 23 23 using System.Collections.Generic; 24 using HEAL.Attic; 24 25 using HeuristicLab.Common; 25 26 using HeuristicLab.Core; 26 27 using HeuristicLab.Data; 27 28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 28 using HEAL.Attic;29 29 30 30 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { … … 47 47 public override IOperation InstrumentedApply() { 48 48 IEnumerable<int> rows = GenerateRowsToEvaluate(); 49 var solution= SymbolicExpressionTreeParameter.ActualValue;49 var tree = SymbolicExpressionTreeParameter.ActualValue; 50 50 var problemData = ProblemDataParameter.ActualValue; 51 51 var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; … … 54 54 55 55 if (UseParameterOptimization) { 56 SymbolicRegressionParameterOptimizationEvaluator.OptimizeParameters(interpreter, solution, problemData, rows, applyLinearScaling, ParameterOptimizationIterations, updateVariableWeights: ParameterOptimizationUpdateVariableWeights, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper);56 SymbolicRegressionParameterOptimizationEvaluator.OptimizeParameters(interpreter, tree, problemData, rows, applyLinearScaling, ParameterOptimizationIterations, updateVariableWeights: ParameterOptimizationUpdateVariableWeights, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper); 57 57 } 58 58 59 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 59 double[] qualities = Calculate( 60 tree, ProblemDataParameter.ActualValue, 61 rows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 62 ApplyLinearScalingParameter.ActualValue.Value, 63 EstimationLimitsParameter.ActualValue.Lower, 64 EstimationLimitsParameter.ActualValue.Upper, 65 DecimalPlaces); 60 66 QualitiesParameter.ActualValue = new DoubleArray(qualities); 61 67 return base.InstrumentedApply(); 62 68 } 63 69 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); 70 public static double[] Calculate( 71 ISymbolicExpressionTree tree, 72 IRegressionProblemData problemData, 73 IEnumerable<int> rows, 74 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 75 bool applyLinearScaling, 76 double lowerEstimationLimit, double upperEstimationLimit, 77 int decimalPlaces) { 78 var mse = SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.Calculate( 79 tree, problemData, rows, 80 interpreter, applyLinearScaling, 81 lowerEstimationLimit, 82 upperEstimationLimit); 67 83 68 84 if (decimalPlaces >= 0) 69 85 mse = Math.Round(mse, decimalPlaces); 70 86 71 return new double[2] { mse, solution.Length };87 return new double[2] { mse, tree.Length }; 72 88 } 73 89 … … 77 93 ApplyLinearScalingParameter.ExecutionContext = context; 78 94 79 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value, DecimalPlaces); 95 double[] quality = Calculate( 96 tree, problemData, rows, 97 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 98 ApplyLinearScalingParameter.ActualValue.Value, 99 EstimationLimitsParameter.ActualValue.Lower, 100 EstimationLimitsParameter.ActualValue.Upper, DecimalPlaces); 80 101 81 102 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
r18132 r18220 61 61 } 62 62 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); 63 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree tree, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) { 64 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 65 tree, problemData, rows, interpreter, applyLinearScaling, 66 lowerEstimationLimit, upperEstimationLimit); 65 67 if (decimalPlaces >= 0) 66 68 r2 = Math.Round(r2, decimalPlaces); 67 return new double[2] { r2, solution.Length };69 return new double[2] { r2, tree.Length }; 68 70 } 69 71 -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Plugin.cs.frame
r17931 r18220 34 34 [PluginDependency("HeuristicLab.Core", "3.3")] 35 35 [PluginDependency("HeuristicLab.Data", "3.3")] 36 [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")] 36 [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")] 37 [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")] 37 38 [PluginDependency("HeuristicLab.Operators", "3.3")] 38 39 [PluginDependency("HeuristicLab.Optimization", "3.3")] … … 41 42 [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")] 42 43 [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")] 44 [PluginDependency("HeuristicLab.Problems.Instances", "3.3")] 45 [PluginDependency("HeuristicLab.Problems.Instances.DataAnalysis", "3.3")] 43 46 public class HeuristicLabProblemsDataAnalysisSymbolicRegressionPlugin : PluginBase { 44 47 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/NMSESingleObjectiveConstraintsEvaluator.cs
r18132 r18220 125 125 var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value; 126 126 127 if (OptimizeParameters) { 128 SymbolicRegressionParameterOptimizationEvaluator.OptimizeParameters(interpreter, tree, problemData, rows, 129 false, ParameterOptimizationIterations, true, 130 estimationLimits.Lower, estimationLimits.Upper); 131 } else { 132 if (applyLinearScaling) { 133 var rootNode = new ProgramRootSymbol().CreateTreeNode(); 134 var startNode = new StartSymbol().CreateTreeNode(); 135 var offset = tree.Root.GetSubtree(0) //Start 136 .GetSubtree(0); //Offset 137 var scaling = offset.GetSubtree(0); 138 139 //Check if tree contains offset and scaling nodes 140 if (!(offset.Symbol is Addition) || !(scaling.Symbol is Multiplication)) 141 throw new ArgumentException($"{ItemName} can only be used with LinearScalingGrammar."); 142 143 var t = (ISymbolicExpressionTreeNode)scaling.GetSubtree(0).Clone(); 144 rootNode.AddSubtree(startNode); 145 startNode.AddSubtree(t); 146 var newTree = new SymbolicExpressionTree(rootNode); 147 148 //calculate alpha and beta for scaling 149 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(newTree, problemData.Dataset, rows); 150 151 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 152 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out var alpha, out var beta, 153 out var errorState); 154 155 if (errorState == OnlineCalculatorError.None) { 156 //Set alpha and beta to the scaling nodes from ia grammar 157 var offsetParameter = offset.GetSubtree(1) as NumberTreeNode; 158 offsetParameter.Value = alpha; 159 var scalingParameter = scaling.GetSubtree(1) as NumberTreeNode; 160 scalingParameter.Value = beta; 161 } 162 } // else: alpha and beta are evolved 163 } 164 165 var quality = Calculate(interpreter, tree, estimationLimits.Lower, estimationLimits.Upper, problemData, rows, 166 BoundsEstimator, UseSoftConstraints, PenalityFactor); 127 var quality = Evaluate(tree, problemData, rows, interpreter, applyLinearScaling, estimationLimits.Lower, estimationLimits.Upper); 167 128 QualityParameter.ActualValue = new DoubleValue(quality); 168 129 … … 170 131 } 171 132 133 private static void CalcLinearScalingTerms( 134 ISymbolicExpressionTree tree, 135 IRegressionProblemData problemData, 136 IEnumerable<int> rows, 137 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter) { 138 var rootNode = new ProgramRootSymbol().CreateTreeNode(); 139 var startNode = new StartSymbol().CreateTreeNode(); 140 var offset = tree.Root.GetSubtree(0) //Start 141 .GetSubtree(0); //Offset 142 var scaling = offset.GetSubtree(0); 143 144 //Check if tree contains offset and scaling nodes 145 if (!(offset.Symbol is Addition) || !(scaling.Symbol is Multiplication)) 146 throw new ArgumentException($"Scaling can only be used with LinearScalingGrammar."); 147 148 var t = (ISymbolicExpressionTreeNode)scaling.GetSubtree(0).Clone(); 149 rootNode.AddSubtree(startNode); 150 startNode.AddSubtree(t); 151 var newTree = new SymbolicExpressionTree(rootNode); 152 153 //calculate alpha and beta for scaling 154 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(newTree, problemData.Dataset, rows); 155 156 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 157 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out var alpha, out var beta, 158 out var errorState); 159 160 if (errorState == OnlineCalculatorError.None) { 161 //Set alpha and beta to the scaling nodes from grammar 162 var offsetParameter = offset.GetSubtree(1) as NumberTreeNode; 163 offsetParameter.Value = alpha; 164 var scalingParameter = scaling.GetSubtree(1) as NumberTreeNode; 165 scalingParameter.Value = beta; 166 } 167 } 168 172 169 public static double Calculate( 170 ISymbolicExpressionTree tree, 171 IRegressionProblemData problemData, IEnumerable<int> rows, 173 172 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 174 ISymbolicExpressionTree tree,175 173 double lowerEstimationLimit, double upperEstimationLimit, 176 IRegressionProblemData problemData, IEnumerable<int> rows,177 174 IBoundsEstimator estimator, 178 175 bool useSoftConstraints = false, double penaltyFactor = 1.0) { 179 176 177 var constraints = Enumerable.Empty<ShapeConstraint>(); 178 if (problemData is ShapeConstrainedRegressionProblemData scProbData) 179 constraints = scProbData.ShapeConstraints.EnabledConstraints; 180 180 181 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 182 var boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 181 183 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 182 var constraints = Enumerable.Empty<ShapeConstraint>(); 183 if (problemData is ShapeConstrainedRegressionProblemData scProbData) { 184 constraints = scProbData.ShapeConstraints.EnabledConstraints; 185 } 184 var nmse = OnlineNormalizedMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out var errorState); 185 if (errorState != OnlineCalculatorError.None) 186 return 1.0; 187 188 if (!constraints.Any()) 189 return nmse; 190 186 191 var intervalCollection = problemData.VariableRanges; 187 188 var boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 189 var nmse = OnlineNormalizedMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, 190 out var errorState); 191 192 if (errorState != OnlineCalculatorError.None) { 192 var constraintViolations = IntervalUtil.GetConstraintViolations(constraints, estimator, intervalCollection, tree); 193 194 // infinite/NaN constraints 195 if (constraintViolations.Any(x => double.IsNaN(x) || double.IsInfinity(x))) 193 196 return 1.0; 194 } 195 196 var constraintViolations = IntervalUtil.GetConstraintViolations(constraints, estimator, intervalCollection, tree); 197 198 if (constraintViolations.Any(x => double.IsNaN(x) || double.IsInfinity(x))) { 199 return 1.0; 200 } 201 202 if (useSoftConstraints) { 203 if (penaltyFactor < 0.0) 204 throw new ArgumentException("The parameter has to be >= 0.0.", nameof(penaltyFactor)); 205 206 var weightedViolationsAvg = constraints 207 .Zip(constraintViolations, (c, v) => c.Weight * v) 208 .Average(); 209 210 return Math.Min(nmse, 1.0) + penaltyFactor * weightedViolationsAvg; 211 } else if (constraintViolations.Any(x => x > 0.0)) { 212 return 1.0; 213 } 214 215 return nmse; 197 198 // hard constraints 199 if (!useSoftConstraints) { 200 if (constraintViolations.Any(x => x > 0.0)) 201 return 1.0; 202 return nmse; 203 } 204 205 // soft constraints 206 if (penaltyFactor < 0.0) 207 throw new ArgumentException("The parameter has to be >= 0.0.", nameof(penaltyFactor)); 208 209 var weightedViolationsAvg = constraints 210 .Zip(constraintViolations, (c, v) => c.Weight * v) 211 .Average(); 212 213 return Math.Min(nmse, 1.0) + penaltyFactor * weightedViolationsAvg; 216 214 } 217 215 … … 223 221 ApplyLinearScalingParameter.ExecutionContext = context; 224 222 225 var nmse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, 226 EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, 227 problemData, rows, BoundsEstimator, UseSoftConstraints, PenalityFactor); 223 var nmse = Calculate( 224 tree, problemData, rows, 225 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 226 EstimationLimitsParameter.ActualValue.Lower, 227 EstimationLimitsParameter.ActualValue.Upper, 228 BoundsEstimator, 229 UseSoftConstraints, 230 PenalityFactor); 228 231 229 232 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 233 236 return nmse; 234 237 } 238 239 public override double Evaluate( 240 ISymbolicExpressionTree tree, 241 IRegressionProblemData problemData, 242 IEnumerable<int> rows, 243 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 244 bool applyLinearScaling = true, 245 double lowerEstimationLimit = double.MinValue, 246 double upperEstimationLimit = double.MaxValue) { 247 248 if (OptimizeParameters) 249 Optimize( 250 interpreter, tree, 251 problemData, rows, 252 ParameterOptimizationIterations, 253 updateVariableWeights: true, 254 lowerEstimationLimit, 255 upperEstimationLimit); 256 else if (applyLinearScaling) // extra scaling terms, which are included in tree 257 CalcLinearScalingTerms(tree, problemData, rows, interpreter); 258 259 return Calculate( 260 tree, problemData, 261 rows, interpreter, 262 lowerEstimationLimit, 263 upperEstimationLimit, 264 BoundsEstimator, 265 UseSoftConstraints, 266 PenalityFactor); 267 } 268 269 public static double Optimize(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 270 ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows, 271 int maxIterations, bool updateVariableWeights = true, 272 double lowerEstimationLimit = double.MinValue, double upperEstimationLimit = double.MaxValue, 273 bool updateParametersInTree = true, Action<double[], double, object> iterationCallback = null, EvaluationsCounter counter = null) { 274 275 // Numeric parameters in the tree become variables for parameter optimization. 276 // Variables in the tree become parameters (fixed values) for parameter optimization. 277 // For each parameter (variable in the original tree) we store the 278 // variable name, variable value (for factor vars) and lag as a DataForVariable object. 279 // A dictionary is used to find parameters 280 double[] initialParameters; 281 var parameters = new List<TreeToAutoDiffTermConverter.DataForVariable>(); 282 283 TreeToAutoDiffTermConverter.ParametricFunction func; 284 TreeToAutoDiffTermConverter.ParametricFunctionGradient func_grad; 285 if (!TreeToAutoDiffTermConverter.TryConvertToAutoDiff(tree, updateVariableWeights, addLinearScalingTerms: false, out parameters, out initialParameters, out func, out func_grad)) 286 throw new NotSupportedException("Could not optimize parameters of symbolic expression tree due to not supported symbols used in the tree."); 287 var parameterEntries = parameters.ToArray(); // order of entries must be the same for x 288 289 // extract initial parameters 290 double[] c = (double[])initialParameters.Clone(); 291 292 double originalQuality = SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.Calculate( 293 tree, problemData, rows, 294 interpreter, applyLinearScaling: false, 295 lowerEstimationLimit, 296 upperEstimationLimit); 297 298 if (counter == null) counter = new EvaluationsCounter(); 299 var rowEvaluationsCounter = new EvaluationsCounter(); 300 301 alglib.minlmreport rep; 302 303 IDataset ds = problemData.Dataset; 304 int n = rows.Count(); 305 int k = parameters.Count; 306 307 double[,] x = new double[n, k]; 308 int row = 0; 309 foreach (var r in rows) { 310 int col = 0; 311 foreach (var info in parameterEntries) { 312 if (ds.VariableHasType<double>(info.variableName)) { 313 x[row, col] = ds.GetDoubleValue(info.variableName, r + info.lag); 314 } else if (ds.VariableHasType<string>(info.variableName)) { 315 x[row, col] = ds.GetStringValue(info.variableName, r) == info.variableValue ? 1 : 0; 316 } else throw new InvalidProgramException("found a variable of unknown type"); 317 col++; 318 } 319 row++; 320 } 321 double[] y = ds.GetDoubleValues(problemData.TargetVariable, rows).ToArray(); 322 323 324 alglib.ndimensional_rep xrep = (p, f, obj) => iterationCallback(p, f, obj); 325 326 try { 327 alglib.minlmcreatevj(y.Length, c, out var lmstate); 328 alglib.minlmsetcond(lmstate, 0.0, maxIterations); 329 alglib.minlmsetxrep(lmstate, iterationCallback != null); 330 // alglib.minlmoptguardgradient(lmstate, 1e-5); // for debugging gradient calculation 331 alglib.minlmoptimize(lmstate, CreateFunc(func, x, y), CreateJac(func_grad, x, y), xrep, rowEvaluationsCounter); 332 alglib.minlmresults(lmstate, out c, out rep); 333 // alglib.minlmoptguardresults(lmstate, out var optGuardReport); 334 } catch (ArithmeticException) { 335 return originalQuality; 336 } catch (alglib.alglibexception) { 337 return originalQuality; 338 } 339 340 counter.FunctionEvaluations += rowEvaluationsCounter.FunctionEvaluations / n; 341 counter.GradientEvaluations += rowEvaluationsCounter.GradientEvaluations / n; 342 343 // * TerminationType, completion code: 344 // * -8 optimizer detected NAN/INF values either in the function itself, 345 // or in its Jacobian 346 // * -5 inappropriate solver was used: 347 // * solver created with minlmcreatefgh() used on problem with 348 // general linear constraints (set with minlmsetlc() call). 349 // * -3 constraints are inconsistent 350 // * 2 relative step is no more than EpsX. 351 // * 5 MaxIts steps was taken 352 // * 7 stopping conditions are too stringent, 353 // further improvement is impossible 354 // * 8 terminated by user who called MinLMRequestTermination(). 355 // X contains point which was "current accepted" when termination 356 // request was submitted. 357 if (rep.terminationtype > 0) { 358 UpdateParameters(tree, c, updateVariableWeights); 359 } 360 var quality = SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.Calculate( 361 tree, problemData, rows, 362 interpreter, applyLinearScaling: false, 363 lowerEstimationLimit, upperEstimationLimit); 364 365 if (!updateParametersInTree) UpdateParameters(tree, initialParameters, updateVariableWeights); 366 367 if (originalQuality < quality || double.IsNaN(quality)) { 368 UpdateParameters(tree, initialParameters, updateVariableWeights); 369 return originalQuality; 370 } 371 return quality; 372 } 373 374 private static void UpdateParameters(ISymbolicExpressionTree tree, double[] parameters, bool updateVariableWeights) { 375 int i = 0; 376 foreach (var node in tree.Root.IterateNodesPrefix().OfType<SymbolicExpressionTreeTerminalNode>()) { 377 NumberTreeNode numberTreeNode = node as NumberTreeNode; 378 VariableTreeNodeBase variableTreeNodeBase = node as VariableTreeNodeBase; 379 FactorVariableTreeNode factorVarTreeNode = node as FactorVariableTreeNode; 380 if (numberTreeNode != null) { 381 if (numberTreeNode.Parent.Symbol is Power 382 && numberTreeNode.Parent.GetSubtree(1) == numberTreeNode) continue; // exponents in powers are not optimized (see TreeToAutoDiffTermConverter) 383 numberTreeNode.Value = parameters[i++]; 384 } else if (updateVariableWeights && variableTreeNodeBase != null) 385 variableTreeNodeBase.Weight = parameters[i++]; 386 else if (factorVarTreeNode != null) { 387 for (int j = 0; j < factorVarTreeNode.Weights.Length; j++) 388 factorVarTreeNode.Weights[j] = parameters[i++]; 389 } 390 } 391 } 392 393 private static alglib.ndimensional_fvec CreateFunc(TreeToAutoDiffTermConverter.ParametricFunction func, double[,] x, double[] y) { 394 int d = x.GetLength(1); 395 // row buffer 396 var xi = new double[d]; 397 // function must return residuals, alglib optimizes resid² 398 return (double[] c, double[] resid, object o) => { 399 for (int i = 0; i < y.Length; i++) { 400 Buffer.BlockCopy(x, i * d * sizeof(double), xi, 0, d * sizeof(double)); // copy row. We are using BlockCopy instead of Array.Copy because x has rank 2 401 resid[i] = func(c, xi) - y[i]; 402 } 403 var counter = (EvaluationsCounter)o; 404 counter.FunctionEvaluations += y.Length; 405 }; 406 } 407 408 private static alglib.ndimensional_jac CreateJac(TreeToAutoDiffTermConverter.ParametricFunctionGradient func_grad, double[,] x, double[] y) { 409 int numParams = x.GetLength(1); 410 // row buffer 411 var xi = new double[numParams]; 412 return (double[] c, double[] resid, double[,] jac, object o) => { 413 int numVars = c.Length; 414 for (int i = 0; i < y.Length; i++) { 415 Buffer.BlockCopy(x, i * numParams * sizeof(double), xi, 0, numParams * sizeof(double)); // copy row 416 var tuple = func_grad(c, xi); 417 resid[i] = tuple.Item2 - y[i]; 418 Buffer.BlockCopy(tuple.Item1, 0, jac, i * numVars * sizeof(double), numVars * sizeof(double)); // copy the gradient to jac. BlockCopy because jac has rank 2. 419 } 420 var counter = (EvaluationsCounter)o; 421 counter.FunctionEvaluations += y.Length; 422 counter.GradientEvaluations += y.Length; 423 }; 424 } 425 426 public class EvaluationsCounter { 427 public int FunctionEvaluations = 0; 428 public int GradientEvaluations = 0; 429 } 235 430 } 236 431 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionLogResidualEvaluator.cs
r17180 r18220 54 54 55 55 public override IOperation InstrumentedApply() { 56 var solution= SymbolicExpressionTreeParameter.ActualValue;56 var tree = SymbolicExpressionTreeParameter.ActualValue; 57 57 IEnumerable<int> rows = GenerateRowsToEvaluate(); 58 58 59 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows); 59 double quality = Calculate( 60 tree, ProblemDataParameter.ActualValue, 61 rows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 62 EstimationLimitsParameter.ActualValue.Lower, 63 EstimationLimitsParameter.ActualValue.Upper); 60 64 QualityParameter.ActualValue = new DoubleValue(quality); 61 65 … … 63 67 } 64 68 65 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows) { 66 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 69 public static double Calculate( 70 ISymbolicExpressionTree tree, 71 IRegressionProblemData problemData, 72 IEnumerable<int> rows, 73 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 74 double lowerEstimationLimit, 75 double upperEstimationLimit) { 76 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 67 77 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 68 78 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); … … 83 93 EstimationLimitsParameter.ExecutionContext = context; 84 94 85 double mlr = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows); 95 double mlr = Calculate( 96 tree, problemData, rows, 97 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 98 EstimationLimitsParameter.ActualValue.Lower, 99 EstimationLimitsParameter.ActualValue.Upper); 86 100 87 101 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 90 104 return mlr; 91 105 } 106 107 public override double Evaluate( 108 ISymbolicExpressionTree tree, 109 IRegressionProblemData problemData, 110 IEnumerable<int> rows, 111 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 112 bool applyLinearScaling = true, 113 double lowerEstimationLimit = double.MinValue, 114 double upperEstimationLimit = double.MaxValue) { 115 return Calculate(tree, problemData, rows, interpreter, lowerEstimationLimit, upperEstimationLimit); 116 } 92 117 } 93 118 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionMeanRelativeErrorEvaluator.cs
r17180 r18220 47 47 48 48 public override IOperation InstrumentedApply() { 49 var solution= SymbolicExpressionTreeParameter.ActualValue;49 var tree = SymbolicExpressionTreeParameter.ActualValue; 50 50 IEnumerable<int> rows = GenerateRowsToEvaluate(); 51 51 52 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows); 52 double quality = Calculate( 53 tree, ProblemDataParameter.ActualValue, rows, 54 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 55 EstimationLimitsParameter.ActualValue.Lower, 56 EstimationLimitsParameter.ActualValue.Upper); 53 57 QualityParameter.ActualValue = new DoubleValue(quality); 54 58 … … 56 60 } 57 61 58 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows) { 59 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 62 public static double Calculate( 63 ISymbolicExpressionTree tree, 64 IRegressionProblemData problemData, 65 IEnumerable<int> rows, 66 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 67 double lowerEstimationLimit, double upperEstimationLimit) { 68 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 60 69 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 61 70 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); … … 76 85 EstimationLimitsParameter.ExecutionContext = context; 77 86 78 double mre = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows); 87 double mre = Calculate( 88 tree, problemData, rows, 89 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 90 EstimationLimitsParameter.ActualValue.Lower, 91 EstimationLimitsParameter.ActualValue.Upper); 79 92 80 93 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 83 96 return mre; 84 97 } 98 99 public override double Evaluate( 100 ISymbolicExpressionTree tree, 101 IRegressionProblemData problemData, 102 IEnumerable<int> rows, 103 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 104 bool applyLinearScaling = true, 105 double lowerEstimationLimit = double.MinValue, 106 double upperEstimationLimit = double.MaxValue) { 107 return Calculate(tree, problemData, rows, interpreter, lowerEstimationLimit, upperEstimationLimit); 108 } 85 109 } 86 110 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionParameterOptimizationEvaluator.cs
r18132 r18220 197 197 Parameters.Add(new FixedValueParameter<PercentValue>(ParameterOptimizationRowsPercentageParameterName, "Determines the percentage of the rows which should be used for parameter optimization", new PercentValue(1))); 198 198 } 199 199 200 200 } 201 201 } … … 203 203 private static readonly object locker = new object(); 204 204 public override IOperation InstrumentedApply() { 205 var solution= SymbolicExpressionTreeParameter.ActualValue;205 var tree = SymbolicExpressionTreeParameter.ActualValue; 206 206 double quality; 207 207 if (RandomParameter.ActualValue.NextDouble() < ParameterOptimizationProbability.Value) { 208 208 IEnumerable<int> parameterOptimizationRows = GenerateRowsToEvaluate(ParameterOptimizationRowsPercentage.Value); 209 209 var counter = new EvaluationsCounter(); 210 quality = OptimizeParameters(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, ProblemDataParameter.ActualValue,210 quality = OptimizeParameters(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, ProblemDataParameter.ActualValue, 211 211 parameterOptimizationRows, ApplyLinearScalingParameter.ActualValue.Value, ParameterOptimizationIterations.Value, updateVariableWeights: UpdateVariableWeights, lowerEstimationLimit: EstimationLimitsParameter.ActualValue.Lower, upperEstimationLimit: EstimationLimitsParameter.ActualValue.Upper, updateParametersInTree: UpdateParametersInTree, counter: counter); 212 212 213 213 if (ParameterOptimizationRowsPercentage.Value != RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value) { 214 214 var evaluationRows = GenerateRowsToEvaluate(); 215 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, evaluationRows, ApplyLinearScalingParameter.ActualValue.Value); 215 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 216 tree, ProblemDataParameter.ActualValue, 217 evaluationRows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 218 ApplyLinearScalingParameter.ActualValue.Value, 219 EstimationLimitsParameter.ActualValue.Lower, 220 EstimationLimitsParameter.ActualValue.Upper); 216 221 } 217 222 … … 225 230 } else { 226 231 var evaluationRows = GenerateRowsToEvaluate(); 227 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, evaluationRows, ApplyLinearScalingParameter.ActualValue.Value); 232 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 233 tree, ProblemDataParameter.ActualValue, 234 evaluationRows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 235 ApplyLinearScalingParameter.ActualValue.Value, 236 EstimationLimitsParameter.ActualValue.Lower, 237 EstimationLimitsParameter.ActualValue.Upper); 228 238 } 229 239 QualityParameter.ActualValue = new DoubleValue(quality); 230 240 231 241 return base.InstrumentedApply(); 242 } 243 244 public override double Evaluate( 245 ISymbolicExpressionTree tree, 246 IRegressionProblemData problemData, 247 IEnumerable<int> rows, 248 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 249 bool applyLinearScaling = true, 250 double lowerEstimationLimit = double.MinValue, 251 double upperEstimationLimit = double.MaxValue) { 252 253 var random = RandomParameter.ActualValue; 254 double quality = double.NaN; 255 256 var propability = random.NextDouble(); 257 if (propability < ParameterOptimizationProbability.Value) { 258 quality = OptimizeParameters( 259 interpreter, tree, 260 problemData, rows, 261 applyLinearScaling, 262 ParameterOptimizationIterations.Value, 263 updateVariableWeights: UpdateVariableWeights, 264 lowerEstimationLimit: lowerEstimationLimit, 265 upperEstimationLimit: upperEstimationLimit, 266 updateParametersInTree: UpdateParametersInTree); 267 } 268 if (double.IsNaN(quality) || ParameterOptimizationRowsPercentage.Value != RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value) { 269 quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 270 tree, problemData, 271 rows, interpreter, 272 applyLinearScaling, 273 lowerEstimationLimit, 274 upperEstimationLimit); 275 } 276 return quality; 232 277 } 233 278 … … 242 287 // because Evaluate() is used to get the quality of evolved models on 243 288 // different partitions of the dataset (e.g., best validation model) 244 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 289 double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 290 tree, problemData, rows, 291 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 292 ApplyLinearScalingParameter.ActualValue.Value, 293 EstimationLimitsParameter.ActualValue.Lower, 294 EstimationLimitsParameter.ActualValue.Upper); 245 295 246 296 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 290 340 } 291 341 292 double originalQuality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, tree, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling); 342 double originalQuality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 343 tree, problemData, rows, 344 interpreter, applyLinearScaling, 345 lowerEstimationLimit, 346 upperEstimationLimit); 293 347 294 348 if (counter == null) counter = new EvaluationsCounter(); … … 348 402 } else UpdateParameters(tree, c, updateVariableWeights); 349 403 } 350 var quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, tree, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling); 404 var quality = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate( 405 tree, problemData, rows, 406 interpreter, applyLinearScaling, 407 lowerEstimationLimit, upperEstimationLimit); 351 408 352 409 if (!updateParametersInTree) UpdateParameters(tree, initialParameters, updateVariableWeights); … … 366 423 FactorVariableTreeNode factorVarTreeNode = node as FactorVariableTreeNode; 367 424 if (numberTreeNode != null) { 368 if (numberTreeNode.Parent.Symbol is Power 425 if (numberTreeNode.Parent.Symbol is Power 369 426 && numberTreeNode.Parent.GetSubtree(1) == numberTreeNode) continue; // exponents in powers are not optimizated (see TreeToAutoDiffTermConverter) 370 427 numberTreeNode.Value = parameters[i++]; -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveEvaluator.cs
r17180 r18220 22 22 using HeuristicLab.Common; 23 23 using HEAL.Attic; 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 25 using System.Collections.Generic; 26 24 27 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { 25 28 [StorableType("7EB90F03-4385-474F-BDE7-3B133E8FEAAB")] … … 28 31 protected SymbolicRegressionSingleObjectiveEvaluator(StorableConstructorFlag _) : base(_) { } 29 32 protected SymbolicRegressionSingleObjectiveEvaluator(SymbolicRegressionSingleObjectiveEvaluator original, Cloner cloner) : base(original, cloner) { } 30 protected SymbolicRegressionSingleObjectiveEvaluator(): base() {} 33 protected SymbolicRegressionSingleObjectiveEvaluator(): base() {} 34 public abstract double Evaluate( 35 ISymbolicExpressionTree tree, 36 IRegressionProblemData problemData, 37 IEnumerable<int> rows, 38 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 39 bool applyLinearScaling = true, 40 double lowerEstimationLimit = double.MinValue, 41 double upperEstimationLimit = double.MaxValue); 31 42 } 32 43 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMaxAbsoluteErrorEvaluator.cs
r17180 r18220 43 43 44 44 public override IOperation InstrumentedApply() { 45 var solution= SymbolicExpressionTreeParameter.ActualValue;45 var tree = SymbolicExpressionTreeParameter.ActualValue; 46 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 47 47 48 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 48 double quality = Calculate( 49 tree, ProblemDataParameter.ActualValue, 50 rows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 51 ApplyLinearScalingParameter.ActualValue.Value, 52 EstimationLimitsParameter.ActualValue.Lower, 53 EstimationLimitsParameter.ActualValue.Upper); 49 54 QualityParameter.ActualValue = new DoubleValue(quality); 50 55 … … 52 57 } 53 58 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); 59 public static double Calculate( 60 ISymbolicExpressionTree tree, 61 IRegressionProblemData problemData, 62 IEnumerable<int> rows, 63 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 64 bool applyLinearScaling, 65 double lowerEstimationLimit, 66 double upperEstimationLimit) { 67 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 56 68 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 69 OnlineCalculatorError errorState; … … 76 88 ApplyLinearScalingParameter.ExecutionContext = context; 77 89 78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 90 double mse = Calculate( 91 tree, problemData, rows, 92 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 93 ApplyLinearScalingParameter.ActualValue.Value, 94 EstimationLimitsParameter.ActualValue.Lower, 95 EstimationLimitsParameter.ActualValue.Upper); 79 96 80 97 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 84 101 return mse; 85 102 } 103 104 public override double Evaluate( 105 ISymbolicExpressionTree tree, 106 IRegressionProblemData problemData, 107 IEnumerable<int> rows, 108 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 109 bool applyLinearScaling = true, 110 double lowerEstimationLimit = double.MinValue, 111 double upperEstimationLimit = double.MaxValue) { 112 return Calculate(tree, problemData, rows, interpreter, applyLinearScaling, lowerEstimationLimit, upperEstimationLimit); 113 } 86 114 } 87 115 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanAbsoluteErrorEvaluator.cs
r17180 r18220 43 43 44 44 public override IOperation InstrumentedApply() { 45 var solution= SymbolicExpressionTreeParameter.ActualValue;45 var tree = SymbolicExpressionTreeParameter.ActualValue; 46 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 47 47 48 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 48 double quality = Calculate(tree, 49 ProblemDataParameter.ActualValue, rows, 50 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 51 ApplyLinearScalingParameter.ActualValue.Value, 52 EstimationLimitsParameter.ActualValue.Lower, 53 EstimationLimitsParameter.ActualValue.Upper); 49 54 QualityParameter.ActualValue = new DoubleValue(quality); 50 55 … … 52 57 } 53 58 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); 59 public static double Calculate( 60 ISymbolicExpressionTree tree, 61 IRegressionProblemData problemData, 62 IEnumerable<int> rows, 63 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 64 bool applyLinearScaling, 65 double lowerEstimationLimit, 66 double upperEstimationLimit) { 67 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 56 68 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 69 OnlineCalculatorError errorState; … … 76 88 ApplyLinearScalingParameter.ExecutionContext = context; 77 89 78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 90 double mse = Calculate( 91 tree, problemData, rows, 92 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 93 ApplyLinearScalingParameter.ActualValue.Value, 94 EstimationLimitsParameter.ActualValue.Lower, 95 EstimationLimitsParameter.ActualValue.Upper); 79 96 80 97 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 84 101 return mse; 85 102 } 103 104 public override double Evaluate( 105 ISymbolicExpressionTree tree, 106 IRegressionProblemData problemData, 107 IEnumerable<int> rows, 108 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 109 bool applyLinearScaling = true, 110 double lowerEstimationLimit = double.MinValue, 111 double upperEstimationLimit = double.MaxValue) { 112 return Calculate(tree, problemData, rows, interpreter, applyLinearScaling, lowerEstimationLimit, upperEstimationLimit); 113 } 86 114 } 87 115 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator.cs
r17180 r18220 43 43 44 44 public override IOperation InstrumentedApply() { 45 var solution= SymbolicExpressionTreeParameter.ActualValue;45 var tree = SymbolicExpressionTreeParameter.ActualValue; 46 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 47 47 48 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 48 double quality = Calculate( 49 tree, ProblemDataParameter.ActualValue, 50 rows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 51 ApplyLinearScalingParameter.ActualValue.Value, 52 EstimationLimitsParameter.ActualValue.Lower, 53 EstimationLimitsParameter.ActualValue.Upper); 49 54 QualityParameter.ActualValue = new DoubleValue(quality); 50 55 … … 52 57 } 53 58 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); 59 public static double Calculate( 60 ISymbolicExpressionTree tree, 61 IRegressionProblemData problemData, 62 IEnumerable<int> rows, 63 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 64 bool applyLinearScaling, 65 double lowerEstimationLimit, double upperEstimationLimit) { 66 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 56 67 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 68 OnlineCalculatorError errorState; … … 76 87 ApplyLinearScalingParameter.ExecutionContext = context; 77 88 78 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 89 double mse = Calculate( 90 tree, problemData, rows, 91 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 92 ApplyLinearScalingParameter.ActualValue.Value, 93 EstimationLimitsParameter.ActualValue.Lower, 94 EstimationLimitsParameter.ActualValue.Upper); 79 95 80 96 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 84 100 return mse; 85 101 } 102 103 public override double Evaluate( 104 ISymbolicExpressionTree tree, 105 IRegressionProblemData problemData, 106 IEnumerable<int> rows, 107 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 108 bool applyLinearScaling = true, 109 double lowerEstimationLimit = double.MinValue, 110 double upperEstimationLimit = double.MaxValue) { 111 return Calculate(tree, problemData, rows, interpreter, applyLinearScaling, lowerEstimationLimit, upperEstimationLimit); 112 } 86 113 } 87 114 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.cs
r17180 r18220 48 48 IEnumerable<int> rows = GenerateRowsToEvaluate(); 49 49 50 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 double quality = Calculate( 51 solution, ProblemDataParameter.ActualValue, 52 rows, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 53 ApplyLinearScalingParameter.ActualValue.Value, 54 EstimationLimitsParameter.ActualValue.Lower, 55 EstimationLimitsParameter.ActualValue.Upper); 51 56 QualityParameter.ActualValue = new DoubleValue(quality); 52 57 … … 54 59 } 55 60 56 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 57 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 61 public static double Calculate( 62 ISymbolicExpressionTree tree, 63 IRegressionProblemData problemData, 64 IEnumerable<int> rows, 65 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 66 bool applyLinearScaling, 67 double lowerEstimationLimit, 68 double upperEstimationLimit) { 69 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows); 58 70 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 59 71 OnlineCalculatorError errorState; … … 78 90 ApplyLinearScalingParameter.ExecutionContext = context; 79 91 80 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 92 double r2 = Calculate( 93 tree, problemData, rows, 94 SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 95 ApplyLinearScalingParameter.ActualValue.Value, 96 EstimationLimitsParameter.ActualValue.Lower, 97 EstimationLimitsParameter.ActualValue.Upper); 81 98 82 99 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; … … 86 103 return r2; 87 104 } 105 106 public override double Evaluate( 107 ISymbolicExpressionTree tree, 108 IRegressionProblemData problemData, 109 IEnumerable<int> rows, 110 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 111 bool applyLinearScaling = true, 112 double lowerEstimationLimit = double.MinValue, 113 double upperEstimationLimit = double.MaxValue) { 114 return Calculate( 115 tree, problemData, rows, 116 interpreter, applyLinearScaling, 117 lowerEstimationLimit, upperEstimationLimit); 118 } 88 119 } 89 120 } -
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/ShapeConstrainedRegressionSingleObjectiveProblem.cs
r18107 r18220 55 55 56 56 public override void Load(IRegressionProblemData data) { 57 if (data is ShapeConstrainedRegressionProblemData scProblemData) {58 } else{57 var scProblemData = data as ShapeConstrainedRegressionProblemData; 58 if (scProblemData == null) { 59 59 scProblemData = new ShapeConstrainedRegressionProblemData(data.Dataset, data.AllowedInputVariables, data.TargetVariable, 60 60 data.TrainingPartition, data.TestPartition) {
Note: See TracChangeset
for help on using the changeset viewer.