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);
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }