Changeset 5275 for branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs
- Timestamp:
- 01/11/11 15:03:46 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs
r4555 r5275 34 34 [Item("SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator", "Calculates the mean and the variance of the squared errors of a linearly scaled symbolic regression solution.")] 35 35 [StorableClass] 36 public class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {36 public sealed class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator { 37 37 private const string QualityVarianceParameterName = "QualityVariance"; 38 38 private const string QualitySamplesParameterName = "QualitySamples"; … … 90 90 } 91 91 #endregion 92 [StorableConstructor] 93 private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(bool deserializing) : base(deserializing) { } 94 private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator original, Cloner cloner) : base(original, cloner) { } 92 95 public SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator() 93 96 : base() { … … 102 105 } 103 106 107 public override IDeepCloneable Clone(Cloner cloner) { 108 return new SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(this, cloner); 109 } 110 104 111 public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) { 105 112 double alpha, beta; … … 108 115 double bias, variance, covariance; 109 116 double mse; 110 if (ApplyScaling.Value) { 111 mse = Calculate(interpreter, solution, LowerEstimationLimit.Value, UpperEstimationLimit.Value, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); 112 Alpha = new DoubleValue(alpha); 113 Beta = new DoubleValue(beta); 117 if (ExecutionContext != null) { 118 if (ApplyScaling.Value) { 119 mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); 120 Alpha = new DoubleValue(alpha); 121 Beta = new DoubleValue(beta); 122 } else { 123 mse = CalculateWithScaling(interpreter, solution,lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); 124 } 125 QualityVariance = new DoubleValue(varianceSE); 126 QualitySamples = new IntValue(count); 127 DecompositionBiasParameter.ActualValue = new DoubleValue(bias / meanSE); 128 DecompositionVarianceParameter.ActualValue = new DoubleValue(variance / meanSE); 129 DecompositionCovarianceParameter.ActualValue = new DoubleValue(covariance / meanSE); 114 130 } else { 115 mse = CalculateWithScaling(interpreter, solution, LowerEstimationLimit.Value, UpperEstimationLimit.Value, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); 116 } 117 QualityVariance = new DoubleValue(varianceSE); 118 QualitySamples = new IntValue(count); 119 DecompositionBiasParameter.ActualValue = new DoubleValue(bias / meanSE); 120 DecompositionVarianceParameter.ActualValue = new DoubleValue(variance / meanSE); 121 DecompositionCovarianceParameter.ActualValue = new DoubleValue(covariance / meanSE); 131 if (ApplyScalingParameter.Value != null && ApplyScalingParameter.Value.Value) 132 mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); 133 else 134 mse = CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); 135 } 136 122 137 return mse; 123 138 } … … 126 141 IEnumerable<double> originalValues = dataset.GetEnumeratedVariableValues(targetVariable, rows); 127 142 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, dataset, rows); 128 SymbolicRegressionScaledMeanSquaredErrorEvaluator.CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);143 CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha); 129 144 130 145 return CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, beta, alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance); … … 174 189 } 175 190 } 191 192 /// <summary> 193 /// Calculates linear scaling parameters in one pass. 194 /// The formulas to calculate the scaling parameters were taken from Scaled Symblic Regression by Maarten Keijzer. 195 /// http://www.springerlink.com/content/x035121165125175/ 196 /// </summary> 197 public static void CalculateScalingParameters(IEnumerable<double> original, IEnumerable<double> estimated, out double beta, out double alpha) { 198 IEnumerator<double> originalEnumerator = original.GetEnumerator(); 199 IEnumerator<double> estimatedEnumerator = estimated.GetEnumerator(); 200 OnlineMeanAndVarianceCalculator yVarianceCalculator = new OnlineMeanAndVarianceCalculator(); 201 OnlineMeanAndVarianceCalculator tMeanCalculator = new OnlineMeanAndVarianceCalculator(); 202 OnlineCovarianceEvaluator ytCovarianceEvaluator = new OnlineCovarianceEvaluator(); 203 int cnt = 0; 204 205 while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) { 206 double y = estimatedEnumerator.Current; 207 double t = originalEnumerator.Current; 208 if (IsValidValue(t) && IsValidValue(y)) { 209 tMeanCalculator.Add(t); 210 yVarianceCalculator.Add(y); 211 ytCovarianceEvaluator.Add(y, t); 212 213 cnt++; 214 } 215 } 216 217 if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext()) 218 throw new ArgumentException("Number of elements in original and estimated enumeration doesn't match."); 219 if (cnt < 2) { 220 alpha = 0; 221 beta = 1; 222 } else { 223 if (yVarianceCalculator.Variance.IsAlmost(0.0)) 224 beta = 1; 225 else 226 beta = ytCovarianceEvaluator.Covariance / yVarianceCalculator.Variance; 227 228 alpha = tMeanCalculator.Mean - beta * yVarianceCalculator.Mean; 229 } 230 } 231 232 private static bool IsValidValue(double d) { 233 return !double.IsInfinity(d) && !double.IsNaN(d) && d > -1.0E07 && d < 1.0E07; // don't consider very large or very small values for scaling 234 } 176 235 } 177 236 }
Note: See TracChangeset
for help on using the changeset viewer.