public void MovingP2QuantileEstimatorMedianTest1(int n, int windowSize, double probability, double relativeThreshold, double minSuccessRate) { var random = new Random(); double[] data = new double[n]; for (int i = 0; i < n; i++) { data[i] = 10 + Math.Sin(i / 20.0) * 5 + random.NextDouble(-3, 3); if (random.Next(10) == 0 && i > windowSize / 2) { data[i] += random.Next(20, 50); } data[i] = Math.Round(data[i], 3); } var mp2Estimator = new MovingP2QuantileEstimator(probability, windowSize); var phEstimator = new PartitioningHeapsMovingQuantileEstimator(windowSize, probability); var outputBuilder = new StringBuilder(); outputBuilder.AppendLine("i,data,estimation,true"); int successCounter = 0; for (int i = 0; i < n; i++) { mp2Estimator.Add(data[i]); phEstimator.Add(data[i]); double mp2Estimation = mp2Estimator.GetQuantile(); double trueValue = phEstimator.GetQuantile(); if (Math.Abs(mp2Estimation - trueValue) / trueValue < relativeThreshold) { successCounter++; } outputBuilder.Append(i); outputBuilder.Append(','); outputBuilder.Append(data[i].ToString(TestCultureInfo.Instance)); outputBuilder.Append(','); outputBuilder.Append(mp2Estimation.ToString(TestCultureInfo.Instance)); outputBuilder.Append(','); outputBuilder.Append(trueValue.ToString(TestCultureInfo.Instance)); outputBuilder.AppendLine(); } double actualSuccessRate = successCounter * 1.0 / n; output.WriteLine("ExpectedSuccessRate = " + minSuccessRate.ToString(TestCultureInfo.Instance)); output.WriteLine("ActualSuccessRate = " + actualSuccessRate.ToString(TestCultureInfo.Instance)); output.WriteLine(); output.WriteLine(outputBuilder.ToString()); Assert.True(successCounter * 1.0 / n > minSuccessRate); }
public void HyndmanFanPartitioningHeapsQuantileEstimatorTest() { double[] fullSource = { 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66 }; var probabilities = Enumerable.Range(0, 101).Select(x => (Probability)(x / 100.0)).ToArray(); var types = new[] { HyndmanFanType.Type1, HyndmanFanType.Type2, HyndmanFanType.Type3, HyndmanFanType.Type4, HyndmanFanType.Type5, HyndmanFanType.Type6, HyndmanFanType.Type7, HyndmanFanType.Type8, HyndmanFanType.Type9, }; var comparer = new AbsoluteEqualityComparer(1e-2); var shuffler = new Shuffler(new Random(42)); for (int n = 1; n <= fullSource.Length; n++) { double[] source = fullSource.Take(n).ToArray(); var sample = new Sample(source); foreach (var type in types) { for (int i = 0; i < probabilities.Length; i++) { var probability = probabilities[i]; var hyEstimator = new HyndmanFanQuantileEstimator(type); double expectedValue = hyEstimator.GetQuantile(sample, probability); var phEstimator = new PartitioningHeapsMovingQuantileEstimator(n, probability, type); shuffler.Shuffle(source); foreach (double value in source) { phEstimator.Add(value); } double actualValue = phEstimator.GetQuantile(); if (!comparer.Equals(expectedValue, actualValue)) { Output.WriteLine($"n = {n}, type = {type}, p = {probability}: E = {expectedValue}, A = {actualValue}"); } Assert.Equal(expectedValue, actualValue, comparer); } } } }