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