- Timestamp:
- 10/19/20 14:14:11 (4 years ago)
- Location:
- branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj
r17771 r17776 183 183 <Compile Include="SymbolicRegressionConstraintAnalyzer.cs" /> 184 184 <Compile Include="SymbolicRegressionMetaModelAnalyzer.cs" /> 185 <Compile Include="SymbolicRegressionMultiObjectiveMetaModelAnalyzer.cs" /> 185 186 <Compile Include="SymbolicRegressionPhenotypicDiversityAnalyzer.cs" /> 186 187 <Compile Include="SymbolicRegressionPruningAnalyzer.cs" /> -
branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionMetaModelAnalyzer.cs
r17771 r17776 22 22 private const string BaseProblemParameterName = "Base Problem"; 23 23 private const string AnalyzeXIterationParameterName = "Analyze X Iteration"; 24 private const string BestMetaModelParameterName = "Best Meta Model";25 24 #endregion 26 25 … … 30 29 (IFixedValueParameter<ItemList<T>>)Parameters[ProblemsToAnalyzeParameterName]; 31 30 32 public IValueParameter< SymbolicRegressionSingleObjectiveProblem> BaseProblemParameter =>33 (IValueParameter< SymbolicRegressionSingleObjectiveProblem>)Parameters[BaseProblemParameterName];31 public IValueParameter<T> BaseProblemParameter => 32 (IValueParameter<T>)Parameters[BaseProblemParameterName]; 34 33 35 34 public IFixedValueParameter<IntValue> AnalyzeXIterationParameter => 36 35 (IFixedValueParameter<IntValue>)Parameters[AnalyzeXIterationParameterName]; 37 38 public IResultParameter<ISymbolicRegressionSolution> BestMetaModelParameter =>39 (IResultParameter<ISymbolicRegressionSolution>)Parameters[BestMetaModelParameterName];40 36 #endregion 41 37 42 38 public static int Iterations { get; set; } = 1; 43 39 40 #region constructors and cloning 44 41 protected SymbolicRegressionMetaModelAnalyzer(SymbolicRegressionMetaModelAnalyzer<T> original, Cloner cloner) : 45 42 base(original, cloner) { } … … 55 52 Parameters.Add(new FixedValueParameter<IntValue>(AnalyzeXIterationParameterName, 56 53 "After every X iteration, the analyzer will perform its step.", new IntValue(1))); 57 Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName,58 "The best meta model found."));59 54 } 60 55 … … 72 67 Parameters.Add(new FixedValueParameter<IntValue>(AnalyzeXIterationParameterName, 73 68 "After every X iteration, the analyzer will perform its step.", new IntValue(1))); 69 } 74 70 75 if (!Parameters.ContainsKey(BestMetaModelParameterName)) 76 Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName, 77 "The best meta model found.")); 78 } 71 #endregion 79 72 80 73 public override void InitializeState() { … … 89 82 90 83 //protected abstract bool TryFittingSolution(ISymbolicExpressionTree tree, T problem, out SymbolicRegressionSolution solution); 91 protected abstract void PerformApply(T problem, string targetVariable);84 protected abstract void PerformApply(T baseProblem, IEnumerable<T> problems, string targetVariable); 92 85 93 86 public override IOperation Apply() { … … 98 91 if (Iterations >= AnalyzeXIterationParameter.Value.Value) { 99 92 Iterations = 1; 100 string targetVariable = BaseProblemParameter.Value.ProblemData.TargetVariable; 93 var baseProblem = BaseProblemParameter.Value; 94 var problems = ProblemsToAnalyzeParameter.Value; 95 var targetVariable = BaseProblemParameter.Value.ProblemData.TargetVariable; 101 96 102 foreach (var problem in ProblemsToAnalyzeParameter.Value) { 103 if (problem.ProblemData.TargetVariable == targetVariable) 104 PerformApply(problem, targetVariable); 105 else 106 throw new ArgumentException($"The target variable of the problem '{problem.Name}' does not match with the base problem."); 107 } 108 109 /* 110 * besser als eigenes Problem (abgeleitet von SymbolicRegressionProblem?), vlt auch als "CompoundProblem" (mehrere SymReg Problems in einen)? 111 * eigenes ProblemData? 112 * oder im Analyzer einfach anstatt Dataset -> ProblemData? 113 */ 97 // error handling 98 var badProblems = problems.Where(x => x.ProblemData.TargetVariable != targetVariable); 99 IList<Exception> errors = new List<Exception>(); 100 foreach (var problem in badProblems) 101 errors.Add(new ArgumentException($"The target variable of the problem '{problem.Name}' does not match with the base problem.")); 102 if (badProblems.Any()) 103 throw new AggregateException(errors); 104 105 // apply 106 PerformApply(baseProblem, problems, targetVariable); 114 107 } else { 115 108 Iterations++; -
branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSingleObjectiveMetaModelAnalyzer.cs
r17771 r17776 9 9 using HeuristicLab.Data; 10 10 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 11 using HeuristicLab.Optimization; 11 12 12 13 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { … … 15 16 : SymbolicRegressionMetaModelAnalyzer<SymbolicRegressionSingleObjectiveProblem>, ISymbolicExpressionTreeAnalyzer { 16 17 18 #region constants 19 private const string BestMetaModelParameterName = "Best Meta Model"; 20 #endregion 21 22 #region parameter properties 23 public IResultParameter<ISymbolicRegressionSolution> BestMetaModelParameter => 24 (IResultParameter<ISymbolicRegressionSolution>)Parameters[BestMetaModelParameterName]; 25 #endregion 26 27 #region constructors and cloning 17 28 [StorableConstructor] 18 29 protected SymbolicRegressionSingleObjectiveMetaModelAnalyzer(StorableConstructorFlag _) : base(_) { } … … 20 31 protected SymbolicRegressionSingleObjectiveMetaModelAnalyzer(SymbolicRegressionSingleObjectiveMetaModelAnalyzer original, Cloner cloner) : base(original, cloner) { } 21 32 22 public SymbolicRegressionSingleObjectiveMetaModelAnalyzer() { } 33 public SymbolicRegressionSingleObjectiveMetaModelAnalyzer() { 34 Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName, 35 "The best meta model found.")); 36 } 23 37 24 38 [StorableHook(HookType.AfterDeserialization)] 25 private void AfterDeserialization() { } 39 private void AfterDeserialization() { 40 if (!Parameters.ContainsKey(BestMetaModelParameterName)) 41 Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName, 42 "The best meta model found.")); 43 } 26 44 27 45 public override IDeepCloneable Clone(Cloner cloner) => new SymbolicRegressionSingleObjectiveMetaModelAnalyzer(this, cloner); 46 #endregion 28 47 29 protected override void PerformApply(SymbolicRegressionSingleObjectiveProblem problem, string targetVariable) { 30 double bestQuality = problem.Maximization.Value ? double.MinValue : double.MaxValue; 48 protected override void PerformApply( 49 SymbolicRegressionSingleObjectiveProblem baseProblem, 50 IEnumerable<SymbolicRegressionSingleObjectiveProblem> problems, 51 string targetVariable) { 52 // init 53 var solutions = this.SymbolicExpressionTree.ToArray(); 54 var evaluator = baseProblem.Evaluator; 55 var bestQuality = baseProblem.Maximization.Value ? double.MinValue : double.MaxValue; 31 56 SymbolicRegressionSolution bestMetaModel = null; 32 foreach (var tree in this.SymbolicExpressionTree.ToArray()) { 33 IDataset dataset = problem.ProblemData.Dataset; 34 IEnumerable<int> rows = Enumerable.Range(0, dataset.Rows); 35 var quality = problem.Evaluator.Evaluate(ExecutionContext, tree, problem.ProblemData, rows); 36 37 bool isBetter = problem.Maximization.Value ? (bestQuality < quality) : (bestQuality > quality); 38 if(isBetter) { 39 bestQuality = quality; 40 var model = new SymbolicRegressionModel( 41 targetVariable, 42 (ISymbolicExpressionTree)tree.Clone(), 43 new SymbolicDataAnalysisExpressionTreeInterpreter()); 44 bestMetaModel = new SymbolicRegressionSolution(model, problem.ProblemData); 57 58 // iterate solutions 59 foreach (var solution in solutions) { 60 double qualityAvg = CalculateAverageQuality(solution, evaluator, problems); 61 62 // check if this solution is the best 63 bool isBest = baseProblem.Maximization.Value ? (bestQuality < qualityAvg) : (bestQuality > qualityAvg); 64 if (isBest) { 65 bestQuality = qualityAvg; 66 bestMetaModel = BuildSolution(solution, targetVariable, baseProblem); 45 67 } 46 68 } 47 69 BestMetaModelParameter.ActualValue = bestMetaModel; 48 70 } 71 72 private SymbolicRegressionSolution BuildSolution( 73 ISymbolicExpressionTree solution, 74 string targetVariable, 75 SymbolicRegressionSingleObjectiveProblem baseProblem) { 76 var model = new SymbolicRegressionModel( 77 targetVariable, 78 (ISymbolicExpressionTree)solution.Clone(), 79 new SymbolicDataAnalysisExpressionTreeInterpreter()); 80 return new SymbolicRegressionSolution(model, baseProblem.ProblemData); 81 } 82 83 private double CalculateAverageQuality( 84 ISymbolicExpressionTree solution, 85 ISymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData> evaluator, 86 IEnumerable<SymbolicRegressionSingleObjectiveProblem> problems) { 87 double qualitySum = 0.0; 88 // iterate problems 89 foreach (var problem in problems) { 90 IDataset dataset = problem.ProblemData.Dataset; 91 IEnumerable<int> rows = Enumerable.Range(0, dataset.Rows); 92 // evalute problem with the evaluator of the base problem 93 qualitySum += evaluator.Evaluate(ExecutionContext, solution, problem.ProblemData, rows); 94 } 95 // calculate the average quality 96 return qualitySum / problems.Count(); 97 } 49 98 } 50 99 }
Note: See TracChangeset
for help on using the changeset viewer.