Changeset 8355
- Timestamp:
- 07/30/12 11:08:14 (12 years ago)
- Location:
- trunk/sources
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/HoeffdingsDependenceCalculator.cs
r7969 r8355 103 103 104 104 /// <summary> 105 /// Calculates midranks. Source: Numerical Recipes in C. 105 /// Calculates midranks. Source: Numerical Recipes in C. p 642 106 106 /// </summary> 107 107 /// <param name="w">Sorted array of elements, replaces the elements by their rank, including midranking of ties</param> … … 117 117 } else { 118 118 int j; 119 for (j = i + 1; j < n && w[j] <= w[i]; j++) ; // how far does it go (<= effectively means == as w must be sorted )120 double rank = 0.5 * (i + j - 1);119 for (j = i + 1; j < n && w[j] <= w[i]; j++) ; // how far does it go (<= effectively means == as w must be sorted, side-step equality for double values) 120 double rank = 1 + 0.5 * (i + j - 1); 121 121 int k; 122 for (k = i; k < j - 1; k++) w[k] = rank; // set the rank for all tied entries122 for (k = i; k < j; k++) w[k] = rank; // set the rank for all tied entries 123 123 i = j; 124 124 } 125 125 } 126 126 127 if (i == n - 1) w[n - 1] = n - 1; // if the last element was not tied, this is its rank127 if (i == n - 1) w[n - 1] = n; // if the last element was not tied, this is its rank 128 128 } 129 129 } -
trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis-3.4/StatisticCalculatorsTest.cs
r7915 r8355 139 139 } 140 140 } 141 142 [TestMethod] 143 public void CalculateHoeffdingsDTest() { 144 OnlineCalculatorError error; 145 // direct perfect dependency 146 var xs = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; 147 var ys = new double[] { 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 }; 148 var d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 149 Assert.AreEqual(error, OnlineCalculatorError.None); 150 Assert.AreEqual(d, 1.0, 1E-5); 151 152 // perfect negative dependency 153 ys = xs.Select(x => -x).ToArray(); 154 d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 155 Assert.AreEqual(error, OnlineCalculatorError.None); 156 Assert.AreEqual(d, 1.0, 1E-5); 157 158 // ties 159 xs = new double[] { 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 5.0, 5.0, 5.0 }; 160 ys = new double[] { 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 5.0, 5.0, 6.0, 6.0, 6.0 }; 161 d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 162 Assert.AreEqual(error, OnlineCalculatorError.None); 163 Assert.AreEqual(d, 0.6783, 1E-5); 164 165 // ties 166 xs = new double[] { 1.0, 1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 6.0, 6.0 }; 167 ys = xs.Select(x => x * x).ToArray(); 168 d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 169 Assert.AreEqual(error, OnlineCalculatorError.None); 170 Assert.AreEqual(d, 0.75, 1E-5); 171 172 // degenerate 173 xs = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; 174 ys = new double[] { 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 }; 175 d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 176 Assert.AreEqual(error, OnlineCalculatorError.None); 177 Assert.AreEqual(d, -0.3516, 1E-4); 178 179 180 var normal = new HeuristicLab.Random.NormalDistributedRandom(new HeuristicLab.Random.MersenneTwister(31415), 0, 1); 181 182 xs = Enumerable.Range(0, 1000).Select(i => normal.NextDouble()).ToArray(); 183 ys = Enumerable.Range(0, 1000).Select(i => normal.NextDouble()).ToArray(); 184 185 // independent 186 d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 187 Assert.AreEqual(error, OnlineCalculatorError.None); 188 Assert.AreEqual(d, -0.00023, 1E-5); 189 190 191 xs = Enumerable.Range(0, 1000).Select(i => normal.NextDouble()).ToArray(); 192 ys = xs.Select(x => x * x).ToArray(); 193 194 d = HoeffdingsDependenceCalculator.Calculate(xs, ys, out error); 195 Assert.AreEqual(error, OnlineCalculatorError.None); 196 Assert.AreEqual(d, 0.25071, 1E-5); 197 198 // symmetric? 199 d = HoeffdingsDependenceCalculator.Calculate(ys, xs, out error); 200 Assert.AreEqual(error, OnlineCalculatorError.None); 201 Assert.AreEqual(d, 0.25071, 1E-5); 202 203 } 141 204 } 142 205 }
Note: See TracChangeset
for help on using the changeset viewer.