Changeset 3996 for trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleRSquaredEvaluator.cs
- Timestamp:
- 07/05/10 17:14:22 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Evaluators/SimpleRSquaredEvaluator.cs
r3452 r3996 49 49 50 50 public static double Calculate(IEnumerable<double> original, IEnumerable<double> estimated) { 51 var onlinePearsonRSquaredEvaluator = new OnlinePearsonsRSquaredEvaluator(); 51 52 var originalEnumerator = original.GetEnumerator(); 52 53 var estimatedEnumerator = estimated.GetEnumerator(); 53 originalEnumerator.MoveNext();54 estimatedEnumerator.MoveNext();55 double e = estimatedEnumerator.Current;56 double o = originalEnumerator.Current;57 54 58 // stable and iterative calculation of R² in one pass over original and estimated59 double sum_sq_x = 0.0;60 double sum_sq_y = 0.0;61 double sum_coproduct = 0.0;62 if (IsInvalidValue(o) || IsInvalidValue(e)) {63 throw new ArgumentException("R² is not defined for variables with NaN or infinity values.");64 }65 double mean_x = o;66 double mean_y = e;67 int n = 1;68 55 while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) { 69 e = estimatedEnumerator.Current; 70 o = originalEnumerator.Current; 71 double sweep = (n - 1.0) / n; 72 if (IsInvalidValue(o) || IsInvalidValue(e)) { 73 throw new ArgumentException("Correlation coefficient is not defined for variables with NaN or infinity values."); 74 } 75 double delta_x = o - mean_x; 76 double delta_y = e - mean_y; 77 sum_sq_x += delta_x * delta_x * sweep; 78 sum_sq_y += delta_y * delta_y * sweep; 79 sum_coproduct += delta_x * delta_y * sweep; 80 mean_x += delta_x / n; 81 mean_y += delta_y / n; 82 n++; 56 double e = estimatedEnumerator.Current; 57 double o = originalEnumerator.Current; 58 onlinePearsonRSquaredEvaluator.Add(o, e); 83 59 } 84 60 if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext()) { 85 61 throw new ArgumentException("Number of elements in original and estimated enumeration doesn't match."); 86 62 } else { 87 double pop_sd_x = Math.Sqrt(sum_sq_x / n); 88 double pop_sd_y = Math.Sqrt(sum_sq_y / n); 89 double cov_x_y = sum_coproduct / n; 90 91 if (pop_sd_x.IsAlmost(0.0) || pop_sd_y.IsAlmost(0.0)) 92 return 0.0; 93 else { 94 double r = cov_x_y / (pop_sd_x * pop_sd_y); 95 return r * r; 96 } 63 return onlinePearsonRSquaredEvaluator.RSquared; 97 64 } 98 65 }
Note: See TracChangeset
for help on using the changeset viewer.