- Timestamp:
- 04/21/10 15:21:34 (15 years ago)
- Location:
- trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/BestValidationSymbolicRegressionSolutionVisualizer.cs
r3452 r3462 39 39 [StorableClass] 40 40 public sealed class BestValidationSymbolicRegressionSolutionVisualizer : SingleSuccessorOperator, ISingleObjectiveSolutionsVisualizer, ISolutionsVisualizer { 41 private const string EvaluatorParameterName = "Evaluator";41 private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter"; 42 42 private const string SymbolicRegressionModelParameterName = "SymbolicRegressionModel"; 43 43 private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData"; … … 49 49 50 50 #region parameter properties 51 public ILookupParameter<ISymbolic RegressionEvaluator> EvaluatorParameter {52 get { return (ILookupParameter<ISymbolic RegressionEvaluator>)Parameters[EvaluatorParameterName]; }51 public ILookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter { 52 get { return (ILookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; } 53 53 } 54 54 public IValueLookupParameter<IntValue> ValidationSamplesStartParameter { … … 82 82 83 83 #region properties 84 public ISymbolic RegressionEvaluator Evaluator {85 get { return EvaluatorParameter.ActualValue; }84 public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter { 85 get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; } 86 86 } 87 87 public IntValue ValidationSamplesStart { … … 98 98 Parameters.Add(new SubScopesLookupParameter<DoubleValue>(QualityParameterName, "The quality of the symbolic regression solutions.")); 99 99 Parameters.Add(new LookupParameter<DataAnalysisProblemData>(DataAnalysisProblemDataParameterName, "The symbolic regression problme data on which the best solution should be evaluated.")); 100 Parameters.Add(new LookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used to calculate the output values of symbolic expression trees.")); 100 101 Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesStartParameterName, "The start index of the validation partition (part of the training partition).")); 101 102 Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesEndParameterName, "The end index of the validation partition (part of the training partition).")); … … 113 114 114 115 var currentBestExpression = (from expression in expressions 115 let validationQuality = SymbolicRegressionMeanSquaredErrorEvaluator.Calculate(expression, problemData.Dataset, problemData.TargetVariable.Value, validationSamplesStart, validationSamplesEnd) 116 let validationQuality = 117 SymbolicRegressionMeanSquaredErrorEvaluator.Calculate( 118 SymbolicExpressionTreeInterpreter, expression, 119 problemData.Dataset, problemData.TargetVariable.Value, 120 validationSamplesStart, validationSamplesEnd) 116 121 select new { Expression = expression, ValidationQuality = validationQuality }) 117 122 .OrderBy(x => x.ValidationQuality) … … 121 126 if (bestOfRunSolution == null) { 122 127 // no best of run solution yet -> make a solution from the currentBestExpression 123 UpdateBestOfRunSolution(problemData, currentBestExpression.Expression );128 UpdateBestOfRunSolution(problemData, currentBestExpression.Expression, SymbolicExpressionTreeInterpreter); 124 129 } else { 125 130 // compare quality of current best with best of run solution … … 127 132 var bestOfRunValidationQuality = SimpleMSEEvaluator.Calculate(validationValues, estimatedValidationValues); 128 133 if (bestOfRunValidationQuality > currentBestExpression.ValidationQuality) { 129 UpdateBestOfRunSolution(problemData, currentBestExpression.Expression );134 UpdateBestOfRunSolution(problemData, currentBestExpression.Expression, SymbolicExpressionTreeInterpreter); 130 135 } 131 136 } … … 135 140 } 136 141 137 private void UpdateBestOfRunSolution(DataAnalysisProblemData problemData, SymbolicExpressionTree tree) { 138 var newBestSolution = CreateDataAnalysisSolution(problemData, tree); 139 BestValidationSolutionParameter.ActualValue = newBestSolution; 142 private void UpdateBestOfRunSolution(DataAnalysisProblemData problemData, SymbolicExpressionTree tree, ISymbolicExpressionTreeInterpreter interpreter) { 143 var newBestSolution = CreateDataAnalysisSolution(problemData, tree, interpreter); 144 if (BestValidationSolutionParameter.ActualValue == null) 145 BestValidationSolutionParameter.ActualValue = newBestSolution; 146 else 147 // only update model 148 BestValidationSolutionParameter.ActualValue.Model = newBestSolution.Model; 140 149 141 150 var trainingValues = problemData.Dataset.GetVariableValues(problemData.TargetVariable.Value, problemData.TrainingSamplesStart.Value, problemData.TrainingSamplesEnd.Value); … … 160 169 } 161 170 162 private SymbolicRegressionModel CreateModel(DataAnalysisProblemData problemData, SymbolicExpressionTree expression) { 163 return new SymbolicRegressionModel(expression, problemData.InputVariables.Select(x => x.Value)); 164 } 165 166 private SymbolicRegressionSolution CreateDataAnalysisSolution(DataAnalysisProblemData problemData, SymbolicExpressionTree expression) { 167 return new SymbolicRegressionSolution(problemData, CreateModel(problemData, expression)); 171 private SymbolicRegressionSolution CreateDataAnalysisSolution(DataAnalysisProblemData problemData, SymbolicExpressionTree expression, ISymbolicExpressionTreeInterpreter interpreter) { 172 var model = new SymbolicRegressionModel(interpreter, expression, problemData.InputVariables.Select(s => s.Value)); 173 return new SymbolicRegressionSolution(problemData, model); 168 174 } 169 175 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionEvaluator.cs
r3452 r3462 34 34 using HeuristicLab.Problems.DataAnalysis; 35 35 using HeuristicLab.Operators; 36 using HeuristicLab.Problems.DataAnalysis.Symbolic; 36 37 37 38 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic { … … 40 41 public abstract class SymbolicRegressionEvaluator : SingleSuccessorOperator, ISymbolicRegressionEvaluator { 41 42 private const string QualityParameterName = "Quality"; 43 private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter"; 42 44 private const string FunctionTreeParameterName = "FunctionTree"; 43 45 private const string RegressionProblemDataParameterName = "RegressionProblemData"; … … 49 51 public ILookupParameter<DoubleValue> QualityParameter { 50 52 get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; } 53 } 54 55 public ILookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter { 56 get { return (ILookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; } 51 57 } 52 58 … … 72 78 #endregion 73 79 #region properties 80 public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter { 81 get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; } 82 } 74 83 public SymbolicExpressionTree SymbolicExpressionTree { 75 84 get { return SymbolicExpressionTreeParameter.ActualValue; } … … 89 98 : base() { 90 99 Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The quality of the evaluated symbolic regression solution.")); 100 Parameters.Add(new LookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used to calculate the output values of the symbolic expression tree.")); 91 101 Parameters.Add(new LookupParameter<SymbolicExpressionTree>(FunctionTreeParameterName, "The symbolic regression solution encoded as a symbolic expression tree.")); 92 102 Parameters.Add(new LookupParameter<DataAnalysisProblemData>(RegressionProblemDataParameterName, "The problem data on which the symbolic regression solution should be evaluated.")); … … 98 108 public override IOperation Apply() { 99 109 DoubleValue numberOfEvaluatedNodes = NumberOfEvaluatedNodesParameter.ActualValue; 100 QualityParameter.ActualValue = new DoubleValue(Evaluate(SymbolicExpressionTree , RegressionProblemData.Dataset,110 QualityParameter.ActualValue = new DoubleValue(Evaluate(SymbolicExpressionTreeInterpreter, SymbolicExpressionTree, RegressionProblemData.Dataset, 101 111 RegressionProblemData.TargetVariable, SamplesStart, SamplesEnd, numberOfEvaluatedNodes)); 102 112 return null; 103 113 } 104 114 105 protected abstract double Evaluate(SymbolicExpressionTree solution, Dataset dataset, StringValue targetVariable, IntValue samplesStart, IntValue samplesEnd, DoubleValue numberOfEvaluatedNodes); 115 protected abstract double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, 116 SymbolicExpressionTree solution, 117 Dataset dataset, 118 StringValue targetVariable, 119 IntValue samplesStart, IntValue samplesEnd, 120 DoubleValue numberOfEvaluatedNodes); 106 121 } 107 122 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionMeanSquaredErrorEvaluator.cs
r3374 r3462 41 41 [StorableClass] 42 42 public class SymbolicRegressionMeanSquaredErrorEvaluator : SymbolicRegressionEvaluator { 43 protected override double Evaluate( SymbolicExpressionTree solution, Dataset dataset, StringValue targetVariable, IntValue samplesStart, IntValue samplesEnd, DoubleValue numberOfEvaluatedNodes) {44 double mse = Calculate( solution, dataset, targetVariable.Value, samplesStart.Value, samplesEnd.Value);43 protected override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, Dataset dataset, StringValue targetVariable, IntValue samplesStart, IntValue samplesEnd, DoubleValue numberOfEvaluatedNodes) { 44 double mse = Calculate(interpreter, solution, dataset, targetVariable.Value, samplesStart.Value, samplesEnd.Value); 45 45 numberOfEvaluatedNodes.Value += solution.Size * (samplesEnd.Value - samplesStart.Value); 46 46 return mse; 47 47 } 48 48 49 public static double Calculate(SymbolicExpressionTree solution, Dataset dataset, string targetVariable, int start, int end) { 50 SimpleArithmeticExpressionEvaluator evaluator = new SimpleArithmeticExpressionEvaluator(); 49 public static double Calculate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, Dataset dataset, string targetVariable, int start, int end) { 51 50 int targetVariableIndex = dataset.GetVariableIndex(targetVariable); 52 var estimatedValues = evaluator.EstimatedValues(solution, dataset, Enumerable.Range(start, end - start));51 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, dataset, Enumerable.Range(start, end - start)); 53 52 var originalValues = from row in Enumerable.Range(start, end - start) select dataset[row, targetVariableIndex]; 54 53 return SimpleMSEEvaluator.Calculate(originalValues, estimatedValues); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs
r3442 r3462 38 38 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic { 39 39 [StorableClass] 40 public class SymbolicRegressionModel : DeepCloneable, IModel { 40 [Item("SymbolicRegressionModel", "A symbolic regression model represents an entity that provides estimated values based on input values.")] 41 public class SymbolicRegressionModel : Item { 41 42 [Storable] 42 43 private SymbolicExpressionTree tree; … … 45 46 } 46 47 [Storable] 47 private SimpleArithmeticExpressionEvaluator evaluator;48 public SimpleArithmeticExpressionEvaluator Evaluator {49 get { return evaluator; }48 private ISymbolicExpressionTreeInterpreter interpreter; 49 public ISymbolicExpressionTreeInterpreter Interpreter { 50 get { return interpreter; } 50 51 } 51 private Dataset emptyDataset; 52 private IEnumerable<int> firstRow = new int[] { 0 }; 52 [Storable] 53 private List<string> inputVariables; 54 public IEnumerable<string> InputVariables { 55 get { return inputVariables.AsEnumerable(); } 56 } 53 57 54 58 public SymbolicRegressionModel() : base() { } // for cloning 55 59 56 public SymbolicRegressionModel( SymbolicExpressionTree tree, IEnumerable<string> inputVariables)60 public SymbolicRegressionModel(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree tree, IEnumerable<string> inputVariables) 57 61 : base() { 58 62 this.tree = tree; 59 this. evaluator = new SimpleArithmeticExpressionEvaluator();60 emptyDataset = new Dataset(inputVariables, new double[1, inputVariables.Count()]);63 this.interpreter = interpreter; 64 this.inputVariables = inputVariables.ToList(); 61 65 } 62 66 63 #region IModel Members 64 65 public double GetValue(double[] xs) { 66 if (xs.Length != emptyDataset.Columns) throw new ArgumentException("Length of input vector doesn't match model"); 67 for (int i = 0; i < xs.Length; i++) { 68 emptyDataset[0, i] = xs[i]; 69 } 70 return evaluator.EstimatedValues(tree, emptyDataset, firstRow).First(); 67 public IEnumerable<double> GetEstimatedValues(Dataset dataset, int start, int end) { 68 return interpreter.GetSymbolicExpressionTreeValues(tree, dataset, Enumerable.Range(start, end - start)); 71 69 } 72 70 73 #endregion 71 public override IDeepCloneable Clone(Cloner cloner) { 72 var clone = (SymbolicRegressionModel)base.Clone(cloner); 73 clone.tree = (SymbolicExpressionTree)tree.Clone(cloner); 74 clone.interpreter = (ISymbolicExpressionTreeInterpreter)interpreter.Clone(cloner); 75 clone.inputVariables = new List<string>(inputVariables); 76 return clone; 77 } 74 78 } 75 79 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs
r3452 r3462 34 34 using HeuristicLab.Problems.DataAnalysis.Regression; 35 35 using HeuristicLab.Problems.DataAnalysis.Symbolic; 36 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ArchitectureAlteringOperators; 37 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Manipulators; 38 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Crossovers; 39 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Creators; 36 40 37 41 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic { … … 144 148 var globalGrammar = new GlobalSymbolicExpressionGrammar(grammar); 145 149 var visualizer = new BestValidationSymbolicRegressionSolutionVisualizer(); 150 var interpreter = new SimpleArithmeticExpressionInterpreter(); 146 151 Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as the error of the regression model should be minimized.", new BoolValue(false))); 147 152 Parameters.Add(new ValueParameter<SymbolicExpressionTreeCreator>("SolutionCreator", "The operator which should be used to create new symbolic regression solutions.", creator)); 153 Parameters.Add(new ValueParameter<ISymbolicExpressionTreeInterpreter>("SymbolicExpressionTreeInterpreter", "The interpreter that should be used to evaluate the symbolic expression tree.", interpreter)); 148 154 Parameters.Add(new ValueParameter<ISymbolicRegressionEvaluator>("Evaluator", "The operator which should be used to evaluate symbolic regression solutions.", evaluator)); 149 155 Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The minimal error value that reached by symbolic regression solutions for the problem.")); -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs
r3442 r3462 36 36 [StorableClass] 37 37 public sealed class SymbolicRegressionSolution : DataAnalysisSolution { 38 public new SymbolicRegressionModel Model { 39 get { return (SymbolicRegressionModel)base.Model; } 40 set { base.Model = value; } 38 private SymbolicRegressionModel model; 39 public SymbolicRegressionModel Model { 40 get { return model; } 41 set { 42 if (model != value) { 43 if (value == null) throw new ArgumentNullException(); 44 model = value; 45 OnModelChanged(EventArgs.Empty); 46 } 47 } 41 48 } 42 49 43 50 public SymbolicRegressionSolution() : base() { } 44 51 public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model) 45 : base(problemData, model) { 52 : base(problemData) { 53 this.model = model; 54 RecalculateEstimatedValues(); 55 } 56 57 public event EventHandler ModelChanged; 58 private void OnModelChanged(EventArgs e) { 59 RecalculateEstimatedValues(); 60 var listeners = ModelChanged; 61 if (listeners != null) 62 listeners(this, e); 63 } 64 65 protected override void OnProblemDataChanged(EventArgs e) { 66 RecalculateEstimatedValues(); 67 } 68 69 private void RecalculateEstimatedValues() { 70 estimatedValues = model.GetEstimatedValues(ProblemData.Dataset, 0, ProblemData.Dataset.Rows).ToList(); 71 OnEstimatedValuesChanged(EventArgs.Empty); 72 } 73 74 private List<double> estimatedValues; 75 public override IEnumerable<double> EstimatedValues { 76 get { 77 return estimatedValues.AsEnumerable(); 78 } 79 } 80 81 public override IEnumerable<double> EstimatedTrainingValues { 82 get { 83 int start = ProblemData.TrainingSamplesStart.Value; 84 int n = ProblemData.TrainingSamplesEnd.Value - start; 85 return estimatedValues.Skip(start).Take(n).ToList(); 86 } 87 } 88 89 public override IEnumerable<double> EstimatedTestValues { 90 get { 91 int start = ProblemData.TestSamplesStart.Value; 92 int n = ProblemData.TestSamplesEnd.Value - start; 93 return estimatedValues.Skip(start).Take(n).ToList(); 94 } 46 95 } 47 96 }
Note: See TracChangeset
for help on using the changeset viewer.