Changeset 5894 for trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4
- Timestamp:
- 03/30/11 18:04:03 (13 years ago)
- Location:
- trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationSolution.cs
r5809 r5894 85 85 IEnumerable<double> originalTestClassValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable, ProblemData.TestIndizes); 86 86 87 double trainingAccuracy = OnlineAccuracyEvaluator.Calculate(estimatedTrainingClassValues, originalTrainingClassValues); 88 double testAccuracy = OnlineAccuracyEvaluator.Calculate(estimatedTestClassValues, originalTestClassValues); 87 OnlineEvaluatorError errorState; 88 double trainingAccuracy = OnlineAccuracyEvaluator.Calculate(estimatedTrainingClassValues, originalTrainingClassValues, out errorState); 89 if (errorState != OnlineEvaluatorError.None) trainingAccuracy = double.NaN; 90 double testAccuracy = OnlineAccuracyEvaluator.Calculate(estimatedTestClassValues, originalTestClassValues, out errorState); 91 if (errorState != OnlineEvaluatorError.None) testAccuracy = double.NaN; 89 92 90 93 TrainingAccuracy = trainingAccuracy; -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs
r5889 r5894 105 105 IEnumerable<double> originalTestValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable, ProblemData.TestIndizes); 106 106 107 double trainingMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues); 108 double testMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTestValues, originalTestValues); 109 double trainingR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues); 110 double testR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTestValues, originalTestValues); 107 OnlineEvaluatorError errorState; 108 double trainingMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues, out errorState); 109 TrainingMeanSquaredError = errorState == OnlineEvaluatorError.None ? trainingMSE : double.NaN; 110 double testMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTestValues, originalTestValues, out errorState); 111 TestMeanSquaredError = errorState == OnlineEvaluatorError.None ? testMSE : double.NaN; 111 112 112 TrainingMeanSquaredError = trainingMSE;113 T estMeanSquaredError = testMSE;114 TrainingRSquared = trainingR2;115 TestRSquared = testR2;113 double trainingR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues, out errorState); 114 TrainingRSquared = errorState == OnlineEvaluatorError.None ? trainingR2 : double.NaN; 115 double testR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTestValues, originalTestValues, out errorState); 116 TestRSquared = errorState == OnlineEvaluatorError.None ? testR2 : double.NaN; 116 117 } 117 118 -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ThresholdCalculators/NormalDistributionCutPointsThresholdCalculator.cs
r5849 r5894 64 64 double classValue = group.Key; 65 65 double mean, variance; 66 OnlineMeanAndVarianceCalculator.Calculate(estimatedClassValues, out mean, out variance); 67 classMean[classValue] = mean; 68 classStdDev[classValue] = Math.Sqrt(variance); 66 OnlineEvaluatorError meanErrorState, varianceErrorState; 67 OnlineMeanAndVarianceCalculator.Calculate(estimatedClassValues, out mean, out variance, out meanErrorState, out varianceErrorState); 68 69 if (meanErrorState == OnlineEvaluatorError.None && varianceErrorState == OnlineEvaluatorError.None) { 70 classMean[classValue] = mean; 71 classStdDev[classValue] = Math.Sqrt(variance); 72 } 69 73 } 70 74 double[] originalClasses = classMean.Keys.OrderBy(x => x).ToArray(); -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionSolution.cs
r5809 r5894 114 114 IEnumerable<double> originalTestValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable, ProblemData.TestIndizes); 115 115 116 double trainingMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues); 117 double testMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTestValues, originalTestValues); 118 double trainingR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues); 119 double testR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTestValues, originalTestValues); 120 double trainingRelError = OnlineMeanAbsolutePercentageErrorEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues); 121 double testRelError = OnlineMeanAbsolutePercentageErrorEvaluator.Calculate(estimatedTestValues, originalTestValues); 116 OnlineEvaluatorError errorState; 117 double trainingMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues, out errorState); 118 TrainingMeanSquaredError = errorState == OnlineEvaluatorError.None ? trainingMSE : double.NaN; 119 double testMSE = OnlineMeanSquaredErrorEvaluator.Calculate(estimatedTestValues, originalTestValues, out errorState); 120 TestMeanSquaredError = errorState == OnlineEvaluatorError.None ? testMSE : double.NaN; 122 121 123 TrainingMeanSquaredError = trainingMSE; 124 TestMeanSquaredError = testMSE; 125 TrainingRSquared = trainingR2; 126 TestRSquared = testR2; 127 TrainingRelativeError = trainingRelError; 128 TestRelativeError = testRelError; 122 double trainingR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues, out errorState); 123 TrainingRSquared = errorState == OnlineEvaluatorError.None ? trainingR2 : double.NaN; 124 double testR2 = OnlinePearsonsRSquaredEvaluator.Calculate(estimatedTestValues, originalTestValues, out errorState); 125 TestRSquared = errorState == OnlineEvaluatorError.None ? testR2 : double.NaN; 126 127 double trainingRelError = OnlineMeanAbsolutePercentageErrorEvaluator.Calculate(estimatedTrainingValues, originalTrainingValues, out errorState); 128 TrainingRelativeError = errorState == OnlineEvaluatorError.None ? trainingRelError : double.NaN; 129 double testRelError = OnlineMeanAbsolutePercentageErrorEvaluator.Calculate(estimatedTestValues, originalTestValues, out errorState); 130 TestRelativeError = errorState == OnlineEvaluatorError.None ? testRelError : double.NaN; 129 131 } 130 132 -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IOnlineEvaluator.cs
r5809 r5894 21 21 22 22 23 using System; 23 24 namespace HeuristicLab.Problems.DataAnalysis { 25 [Flags] 26 public enum OnlineEvaluatorError { 27 /// <summary> 28 /// No error occurred 29 /// </summary> 30 None = 0, 31 /// <summary> 32 /// An invalid value has been added (often +/- Infinity and NaN are invalid values) 33 /// </summary> 34 InvalidValueAdded = 1, 35 /// <summary> 36 /// The number of elements added to the evaluator is not sufficient to calculate the result value 37 /// </summary> 38 InsufficientElementsAdded = 2 39 } 24 40 public interface IOnlineEvaluator { 41 OnlineEvaluatorError ErrorState { get; } 25 42 double Value { get; } 26 43 void Reset(); -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineAccuracyEvaluator.cs
r5809 r5894 31 31 public double Accuracy { 32 32 get { 33 if (n < 1) 34 throw new InvalidOperationException("No elements"); 35 else 36 return correctlyClassified / (double)n; 33 return correctlyClassified / (double)n; 37 34 } 38 35 } … … 43 40 44 41 #region IOnlineEvaluator Members 42 private OnlineEvaluatorError errorState; 43 public OnlineEvaluatorError ErrorState { 44 get { return errorState; } 45 } 45 46 public double Value { 46 47 get { return Accuracy; } … … 49 50 n = 0; 50 51 correctlyClassified = 0; 52 errorState = OnlineEvaluatorError.InsufficientElementsAdded; 51 53 } 52 54 53 55 public void Add(double original, double estimated) { 54 if (double.IsNaN(estimated) || double.IsInfinity(estimated) || 55 double.IsNaN(original) || double.IsInfinity(original)) { 56 throw new ArgumentException("Accuracy is not defined for NaN or infinity elements"); 57 } else { 58 if (original.IsAlmost(estimated)) correctlyClassified++; 56 // ignore cases where original is NaN completly 57 if (!double.IsNaN(original)) { 58 // increment number of observed samples 59 59 n++; 60 if (original.IsAlmost(estimated)) { 61 // original = estimated = +Inf counts as correctly classified 62 // original = estimated = -Inf counts as correctly classified 63 correctlyClassified++; 64 } 65 errorState = OnlineEvaluatorError.None; // number of (non-NaN) samples >= 1 60 66 } 61 67 } 62 68 #endregion 63 69 64 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second ) {70 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineEvaluatorError errorState) { 65 71 IEnumerator<double> firstEnumerator = first.GetEnumerator(); 66 72 IEnumerator<double> secondEnumerator = second.GetEnumerator(); … … 78 84 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 79 85 } else { 86 errorState = accuracyEvaluator.ErrorState; 80 87 return accuracyEvaluator.Accuracy; 81 88 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineCovarianceEvaluator.cs
r5845 r5894 39 39 40 40 #region IOnlineEvaluator Members 41 private OnlineEvaluatorError errorState; 42 public OnlineEvaluatorError ErrorState { 43 get { return errorState; } 44 } 41 45 public double Value { 42 46 get { return Covariance; } … … 47 51 originalMean = 0.0; 48 52 estimatedMean = 0.0; 53 errorState = OnlineEvaluatorError.InsufficientElementsAdded; 49 54 } 50 55 51 56 public void Add(double original, double estimated) { 52 if (double.IsNaN(estimated) || double.IsInfinity(estimated) || 53 double.IsNaN(original) || double.IsInfinity(original) || 54 double.IsNaN(Cn)) { 55 Cn = double.NaN; 56 } else { 57 if (double.IsNaN(estimated) || double.IsInfinity(estimated) || double.IsNaN(original) || double.IsInfinity(original)) { 58 errorState = errorState | OnlineEvaluatorError.InvalidValueAdded; 59 } else if (!errorState.HasFlag(OnlineEvaluatorError.InvalidValueAdded)) { 57 60 n++; 61 errorState = OnlineEvaluatorError.None; // n >= 1 62 58 63 // online calculation of tMean 59 64 originalMean = originalMean + (original - originalMean) / n; … … 67 72 #endregion 68 73 69 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second ) {74 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineEvaluatorError errorState) { 70 75 IEnumerator<double> firstEnumerator = first.GetEnumerator(); 71 76 IEnumerator<double> secondEnumerator = second.GetEnumerator(); … … 83 88 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 84 89 } else { 90 errorState = covarianceEvaluator.ErrorState; 85 91 return covarianceEvaluator.Covariance; 86 92 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineLinearScalingParameterCalculator.cs
r5818 r5894 32 32 public double Alpha { 33 33 get { 34 if (cnt < 2) 35 return 0; 36 else 37 return targetMeanCalculator.Mean - Beta * originalMeanAndVarianceCalculator.Mean; 34 return targetMeanCalculator.Mean - Beta * originalMeanAndVarianceCalculator.Mean; 38 35 } 39 36 } … … 44 41 public double Beta { 45 42 get { 46 if (cnt < 2) 47 return 1; 48 else if (originalMeanAndVarianceCalculator.PopulationVariance.IsAlmost(0.0)) 43 if (originalMeanAndVarianceCalculator.PopulationVariance.IsAlmost(0.0)) 49 44 return 1; 50 45 else 51 46 return originalTargetCovarianceEvaluator.Covariance / originalMeanAndVarianceCalculator.PopulationVariance; 47 } 48 } 49 50 public OnlineEvaluatorError ErrorState { 51 get { 52 return targetMeanCalculator.MeanErrorState | originalMeanAndVarianceCalculator.MeanErrorState | 53 originalMeanAndVarianceCalculator.PopulationVarianceErrorState | originalTargetCovarianceEvaluator.ErrorState; 52 54 } 53 55 } … … 94 96 /// <param name="alpha">Additive constant for the linear scaling</param> 95 97 /// <param name="beta">Multiplicative factor for the linear scaling</param> 96 public static void Calculate(IEnumerable<double> original, IEnumerable<double> target, out double alpha, out double beta) { 98 /// <param name="errorState">Flag that indicates if errors occurred in the calculation of the linea scaling parameters.</param> 99 public static void Calculate(IEnumerable<double> original, IEnumerable<double> target, out double alpha, out double beta, out OnlineEvaluatorError errorState) { 97 100 OnlineLinearScalingParameterCalculator calculator = new OnlineLinearScalingParameterCalculator(); 98 101 IEnumerator<double> originalEnumerator = original.GetEnumerator(); … … 110 113 throw new ArgumentException("Number of elements in original and target enumeration do not match."); 111 114 } else { 115 errorState = calculator.ErrorState; 112 116 alpha = calculator.Alpha; 113 117 beta = calculator.Beta; -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineMeanAbsolutePercentageErrorEvaluator.cs
r5845 r5894 40 40 41 41 #region IOnlineEvaluator Members 42 private OnlineEvaluatorError errorState; 43 public OnlineEvaluatorError ErrorState { 44 get { return errorState; } 45 } 42 46 public double Value { 43 47 get { return MeanAbsolutePercentageError; } … … 46 50 n = 0; 47 51 sre = 0.0; 52 errorState = OnlineEvaluatorError.InsufficientElementsAdded; 48 53 } 49 54 … … 51 56 if (double.IsNaN(estimated) || double.IsInfinity(estimated) || 52 57 double.IsNaN(original) || double.IsInfinity(original) || 53 double.IsNaN(sre)) { 54 sre = double.NaN; 55 } else { 56 if (!original.IsAlmost(0.0)) { 57 sre += Math.Abs((estimated - original) / original); 58 n++; 59 } 58 original.IsAlmost(0.0)) { 59 errorState = errorState | OnlineEvaluatorError.InvalidValueAdded; 60 } else if (!errorState.HasFlag(OnlineEvaluatorError.InvalidValueAdded)) { 61 sre += Math.Abs((estimated - original) / original); 62 n++; 63 errorState = OnlineEvaluatorError.None; // n >= 1 60 64 } 61 65 } … … 63 67 #endregion 64 68 65 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second ) {69 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineEvaluatorError errorState) { 66 70 IEnumerator<double> firstEnumerator = first.GetEnumerator(); 67 71 IEnumerator<double> secondEnumerator = second.GetEnumerator(); … … 79 83 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 80 84 } else { 85 errorState = evaluator.ErrorState; 81 86 return evaluator.MeanAbsolutePercentageError; 82 87 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineMeanAndVarianceCalculator.cs
r5845 r5894 29 29 private int n; 30 30 31 private OnlineEvaluatorError varianceErrorState; 32 public OnlineEvaluatorError VarianceErrorState { 33 get { return varianceErrorState; } 34 } 35 31 36 public double Variance { 32 37 get { … … 35 40 } 36 41 42 private OnlineEvaluatorError errorState; 43 public OnlineEvaluatorError PopulationVarianceErrorState { 44 get { return errorState; } 45 } 37 46 public double PopulationVariance { 38 47 get { … … 41 50 } 42 51 52 public OnlineEvaluatorError MeanErrorState { 53 get { return errorState; } 54 } 43 55 public double Mean { 44 56 get { … … 57 69 public void Reset() { 58 70 n = 0; 71 errorState = OnlineEvaluatorError.InsufficientElementsAdded; 72 varianceErrorState = OnlineEvaluatorError.InsufficientElementsAdded; 59 73 } 60 74 61 75 public void Add(double x) { 62 if (double.IsNaN(x) || double.IsInfinity(x) || double.IsNaN(m_newM)) {63 m_newM = double.NaN;64 m_newS = double.NaN;65 } else {76 if (double.IsNaN(x) || double.IsInfinity(x)) { 77 errorState = errorState | OnlineEvaluatorError.InvalidValueAdded; 78 varianceErrorState = errorState | OnlineEvaluatorError.InvalidValueAdded; 79 } else if (!errorState.HasFlag(OnlineEvaluatorError.InvalidValueAdded)) { 66 80 n++; 67 81 // See Knuth TAOCP vol 2, 3rd edition, page 232 … … 69 83 m_oldM = m_newM = x; 70 84 m_oldS = 0.0; 85 errorState = OnlineEvaluatorError.None; // n >= 1 71 86 } else { 87 varianceErrorState = OnlineEvaluatorError.None; // n >= 1 72 88 m_newM = m_oldM + (x - m_oldM) / n; 73 89 m_newS = m_oldS + (x - m_oldM) * (x - m_newM); … … 80 96 } 81 97 82 public static void Calculate(IEnumerable<double> x, out double mean, out double variance ) {98 public static void Calculate(IEnumerable<double> x, out double mean, out double variance, out OnlineEvaluatorError meanErrorState, out OnlineEvaluatorError varianceErrorState) { 83 99 OnlineMeanAndVarianceCalculator meanAndVarianceCalculator = new OnlineMeanAndVarianceCalculator(); 84 100 foreach (double xi in x) { … … 87 103 mean = meanAndVarianceCalculator.Mean; 88 104 variance = meanAndVarianceCalculator.Variance; 105 meanErrorState = meanAndVarianceCalculator.MeanErrorState; 106 varianceErrorState = meanAndVarianceCalculator.VarianceErrorState; 89 107 } 90 108 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineMeanSquaredErrorEvaluator.cs
r5845 r5894 39 39 40 40 #region IOnlineEvaluator Members 41 private OnlineEvaluatorError errorState; 42 public OnlineEvaluatorError ErrorState { 43 get { return errorState; } 44 } 41 45 public double Value { 42 46 get { return MeanSquaredError; } … … 45 49 n = 0; 46 50 sse = 0.0; 51 errorState = OnlineEvaluatorError.InsufficientElementsAdded; 47 52 } 48 53 49 54 public void Add(double original, double estimated) { 50 55 if (double.IsNaN(estimated) || double.IsInfinity(estimated) || 51 double.IsNaN(original) || double.IsInfinity(original) || 52 double.IsNaN(sse)) { 53 sse = double.NaN; 54 } else { 56 double.IsNaN(original) || double.IsInfinity(original)) { 57 errorState = errorState | OnlineEvaluatorError.InvalidValueAdded; 58 } else if (!errorState.HasFlag(OnlineEvaluatorError.InvalidValueAdded)) { 55 59 double error = estimated - original; 56 60 sse += error * error; 57 61 n++; 62 errorState = OnlineEvaluatorError.None; // n >= 1 58 63 } 59 64 } 60 65 #endregion 61 66 62 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second ) {67 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineEvaluatorError errorState) { 63 68 IEnumerator<double> firstEnumerator = first.GetEnumerator(); 64 69 IEnumerator<double> secondEnumerator = second.GetEnumerator(); … … 76 81 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 77 82 } else { 83 errorState = mseEvaluator.ErrorState; 78 84 return mseEvaluator.MeanSquaredError; 79 85 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlineNormalizedMeanSquaredErrorEvaluator.cs
r5809 r5894 43 43 44 44 #region IOnlineEvaluator Members 45 public OnlineEvaluatorError ErrorState { 46 get { return meanSquaredErrorCalculator.MeanErrorState | originalVarianceCalculator.VarianceErrorState; } 47 } 45 48 public double Value { 46 49 get { return NormalizedMeanSquaredError; } … … 60 63 #endregion 61 64 62 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second ) {65 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineEvaluatorError errorState) { 63 66 IEnumerator<double> firstEnumerator = first.GetEnumerator(); 64 67 IEnumerator<double> secondEnumerator = second.GetEnumerator(); … … 76 79 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 77 80 } else { 81 errorState = normalizedMSEEvaluator.ErrorState; 78 82 return normalizedMSEEvaluator.NormalizedMeanSquaredError; 79 83 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineEvaluators/OnlinePearsonsRSquaredEvaluator.cs
r5809 r5894 46 46 47 47 #region IOnlineEvaluator Members 48 public OnlineEvaluatorError ErrorState { 49 get { return covEvaluator.ErrorState | sxEvaluator.PopulationVarianceErrorState | syEvaluator.PopulationVarianceErrorState; } 50 } 48 51 public double Value { 49 52 get { return RSquared; } … … 64 67 #endregion 65 68 66 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second ) {69 public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineEvaluatorError errorState) { 67 70 IEnumerator<double> firstEnumerator = first.GetEnumerator(); 68 71 IEnumerator<double> secondEnumerator = second.GetEnumerator(); … … 80 83 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 81 84 } else { 85 errorState = rSquaredEvaluator.ErrorState; 82 86 return rSquaredEvaluator.RSquared; 83 87 }
Note: See TracChangeset
for help on using the changeset viewer.