Changeset 2977 for trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/LinearScalingPredictorBuilder.cs
- Timestamp:
- 03/09/10 09:40:52 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/LinearScalingPredictorBuilder.cs
r2722 r2977 35 35 : base() { 36 36 AddVariableInfo(new VariableInfo("FunctionTree", "The function tree", typeof(IGeneticProgrammingModel), VariableKind.In)); 37 AddVariableInfo(new VariableInfo("PunishmentFactor", "The punishment factor limits the estimated values to a certain range", typeof(DoubleData), VariableKind.In)); 38 AddVariableInfo(new VariableInfo("Dataset", "The dataset", typeof(Dataset), VariableKind.In)); 39 AddVariableInfo(new VariableInfo("TrainingSamplesStart", "Start index of training set", typeof(DoubleData), VariableKind.In)); 40 AddVariableInfo(new VariableInfo("TrainingSamplesEnd", "End index of training set", typeof(DoubleData), VariableKind.In)); 41 AddVariableInfo(new VariableInfo("TargetVariable", "Name of the target variable", typeof(StringData), VariableKind.In)); 37 AddVariableInfo(new VariableInfo("Beta", "Beta parameter for linear scaling as calculated by LinearScaler", typeof(DoubleData), VariableKind.In)); 38 AddVariableInfo(new VariableInfo("Alpha", "Alpha parameter for linear scaling as calculated by LinearScaler", typeof(DoubleData), VariableKind.In)); 39 AddVariableInfo(new VariableInfo("UpperEstimationLimit", "Upper limit for estimated value (optional)", typeof(DoubleData), VariableKind.In)); 40 AddVariableInfo(new VariableInfo("LowerEstimationLimit", "Lower limit for estimated value (optional)", typeof(DoubleData), VariableKind.In)); 42 41 AddVariableInfo(new VariableInfo("Predictor", "The predictor combines the function tree and the evaluator and can be used to generate estimated values", typeof(IPredictor), VariableKind.New)); 43 42 } … … 49 48 public override IOperation Apply(IScope scope) { 50 49 IGeneticProgrammingModel model = GetVariableValue<IGeneticProgrammingModel>("FunctionTree", scope, true); 51 double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data; 52 Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true); 53 int start = GetVariableValue<IntData>("TrainingSamplesStart", scope, true).Data; 54 int end = GetVariableValue<IntData>("TrainingSamplesEnd", scope, true).Data; 55 string targetVariable = GetVariableValue<StringData>("TargetVariable", scope, true).Data; 56 IPredictor predictor = CreatePredictor(model, punishmentFactor, dataset, targetVariable, start, end); 50 //double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data; 51 //Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true); 52 //int start = GetVariableValue<IntData>("TrainingSamplesStart", scope, true).Data; 53 //int end = GetVariableValue<IntData>("TrainingSamplesEnd", scope, true).Data; 54 //string targetVariable = GetVariableValue<StringData>("TargetVariable", scope, true).Data; 55 double alpha = GetVariableValue<DoubleData>("Alpha", scope, true).Data; 56 double beta = GetVariableValue<DoubleData>("Beta", scope, true).Data; 57 DoubleData lowerLimit = GetVariableValue<DoubleData>("LowerEstimationLimit", scope, true, false); 58 DoubleData upperLimit = GetVariableValue<DoubleData>("UpperEstimationLimit", scope, true, false); 59 IPredictor predictor; 60 if (lowerLimit == null || upperLimit == null) 61 predictor = CreatePredictor(model, beta, alpha, double.NegativeInfinity, double.PositiveInfinity); 62 else 63 predictor = CreatePredictor(model, beta, alpha, lowerLimit.Data, upperLimit.Data); 57 64 scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("Predictor"), predictor)); 58 65 return null; 59 66 } 60 67 61 public static IPredictor CreatePredictor(IGeneticProgrammingModel model, double punishmentFactor, 62 Dataset dataset, string targetVariable, int start, int end) { 63 return CreatePredictor(model, punishmentFactor, dataset, dataset.GetVariableIndex(targetVariable), start, end); 64 } 65 66 67 public static IPredictor CreatePredictor(IGeneticProgrammingModel model, double punishmentFactor, 68 Dataset dataset, int targetVariable, int start, int end) { 68 public static IPredictor CreatePredictor(IGeneticProgrammingModel model, double beta, double alpha, double lowerLimit, double upperLimit) { 69 69 70 70 var evaluator = new HL3TreeEvaluator(); 71 // evaluate for all rows 72 evaluator.PrepareForEvaluation(dataset, model.FunctionTree); 73 var result = from row in Enumerable.Range(start, end - start) 74 let y = evaluator.Evaluate(row) 75 let y_ = dataset.GetValue(row, targetVariable) 76 select new { Row = row, Estimation = y, Target = y_ }; 77 78 // calculate alpha and beta on the subset of rows with valid values 79 var filteredResult = result.Where(x => IsValidValue(x.Target) && IsValidValue(x.Estimation)); 80 var target = filteredResult.Select(x => x.Target); 81 var estimation = filteredResult.Select(x => x.Estimation); 82 double a, b; 83 if (filteredResult.Count() > 2) { 84 double tMean = target.Sum() / target.Count(); 85 double xMean = estimation.Sum() / estimation.Count(); 86 double sumXT = 0; 87 double sumXX = 0; 88 foreach (var r in result) { 89 double x = r.Estimation; 90 double t = r.Target; 91 sumXT += (x - xMean) * (t - tMean); 92 sumXX += (x - xMean) * (x - xMean); 93 } 94 b = sumXT / sumXX; 95 a = tMean - b * xMean; 96 } else { 97 b = 1.0; 98 a = 0.0; 99 } 100 double mean = dataset.GetMean(targetVariable, start, end); 101 double range = dataset.GetRange(targetVariable, start, end); 102 double minEstimatedValue = mean - punishmentFactor * range; 103 double maxEstimatedValue = mean + punishmentFactor * range; 104 evaluator.LowerEvaluationLimit = minEstimatedValue; 105 evaluator.UpperEvaluationLimit = maxEstimatedValue; 106 var resultModel = new GeneticProgrammingModel(MakeSum(MakeProduct(model.FunctionTree, b), a)); 107 return new Predictor(evaluator, resultModel, minEstimatedValue, maxEstimatedValue); 71 evaluator.LowerEvaluationLimit = lowerLimit; 72 evaluator.UpperEvaluationLimit = upperLimit; 73 var resultModel = new GeneticProgrammingModel(MakeSum(MakeProduct(model.FunctionTree, beta), alpha)); 74 return new Predictor(evaluator, resultModel, lowerLimit, upperLimit); 108 75 } 109 110 private static bool IsValidValue(double d) {111 return !double.IsInfinity(d) && !double.IsNaN(d);112 }113 114 76 115 77 private static IFunctionTree MakeSum(IFunctionTree tree, double x) { … … 134 96 return constX; 135 97 } 136 137 private static void CalculateScalingParameters(IEnumerable<double> xs, IEnumerable<double> ys, out double k, out double d) {138 if (xs.Count() != ys.Count()) throw new ArgumentException();139 double xMean = xs.Sum() / xs.Count();140 double yMean = ys.Sum() / ys.Count();141 142 var yEnumerator = ys.GetEnumerator();143 var xEnumerator = xs.GetEnumerator();144 145 double sumXY = 0.0;146 double sumXX = 0.0;147 while (xEnumerator.MoveNext() && yEnumerator.MoveNext()) {148 sumXY += (xEnumerator.Current - xMean) * (yEnumerator.Current - yMean);149 sumXX += (xEnumerator.Current - xMean) * (xEnumerator.Current - xMean);150 }151 152 k = sumXY / sumXX;153 d = yMean - k * xMean;154 }155 98 } 156 99 }
Note: See TracChangeset
for help on using the changeset viewer.