Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/11/11 15:03:46 (13 years ago)
Author:
gkronber
Message:

Merged changes from trunk to data analysis exploration branch and added fractional distance metric evaluator. #1142

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs

    r4555 r5275  
    3434  [Item("SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator", "Calculates the mean and the variance of the squared errors of a linearly scaled symbolic regression solution.")]
    3535  [StorableClass]
    36   public class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
     36  public sealed class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
    3737    private const string QualityVarianceParameterName = "QualityVariance";
    3838    private const string QualitySamplesParameterName = "QualitySamples";
     
    9090    }
    9191    #endregion
     92    [StorableConstructor]
     93    private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
     94    private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator original, Cloner cloner) : base(original, cloner) { }
    9295    public SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator()
    9396      : base() {
     
    102105    }
    103106
     107    public override IDeepCloneable Clone(Cloner cloner) {
     108      return new SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(this, cloner);
     109    }
     110
    104111    public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
    105112      double alpha, beta;
     
    108115      double bias, variance, covariance;
    109116      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);
    114130      } 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
    122137      return mse;
    123138    }
     
    126141      IEnumerable<double> originalValues = dataset.GetEnumeratedVariableValues(targetVariable, rows);
    127142      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);
    129144
    130145      return CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, beta, alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
     
    174189      }
    175190    }
     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    }
    176235  }
    177236}
Note: See TracChangeset for help on using the changeset viewer.