Пример #1
0
        public void QuantileEstimator_AllEqualTest()
        {
            double middle = 3.4;
            double next   = MMath.NextDouble(middle);

            double[] x     = { middle, middle, middle };
            var      outer = new OuterQuantiles(x);

            Assert.Equal(0.0, outer.GetProbLessThan(middle));
            Assert.Equal(middle, outer.GetQuantile(0.0));
            Assert.Equal(middle, outer.GetQuantile(0.75));
            Assert.Equal(1.0, outer.GetProbLessThan(next));
            Assert.Equal(next, outer.GetQuantile(1.0));
            foreach (int weight in new[] { 1, 2, 3 })
            {
                var est = new QuantileEstimator(0.01);
                foreach (var item in x)
                {
                    est.Add(item, weight);
                }
                Assert.Equal(0.0, est.GetProbLessThan(middle));
                Assert.Equal(middle, est.GetQuantile(0.0));
                Assert.Equal(1.0, est.GetProbLessThan(next));
                Assert.Equal(next, est.GetQuantile(1.0));
            }
        }
Пример #2
0
        public void QuantileEstimator_DoubleDuplicationTest()
        {
            double first   = 1;
            double second  = 2;
            double between = (first + second) / 2;
            double next    = MMath.NextDouble(second);

            double[] x = { first, first, second, second };
            // quantiles are 0, 1/3, 2/3, 1
            var outer = new OuterQuantiles(x);

            Assert.Equal(0.0, outer.GetProbLessThan(first));
            Assert.Equal(first, outer.GetQuantile(0.0));
            Assert.Equal(0.5, outer.GetProbLessThan(between));
            Assert.Equal(between, outer.GetQuantile(0.5));
            Assert.Equal(2.0 / 3, outer.GetProbLessThan(second));
            Assert.Equal(second, outer.GetQuantile(2.0 / 3));
            Assert.Equal(1.0, outer.GetProbLessThan(next));
            Assert.Equal(next, outer.GetQuantile(1.0));
            CheckGetQuantile(outer, outer);
            var inner = InnerQuantiles.FromDistribution(5, outer);

            CheckGetQuantile(inner, inner, (int)Math.Ceiling(100.0 / 6), (int)Math.Floor(100.0 * 5 / 6));
            var est = new QuantileEstimator(0.01);

            est.Add(first, 2);
            est.Add(second, 2);
            Assert.Equal(0.0, est.GetProbLessThan(first));
            Assert.Equal(first, est.GetQuantile(0.0));
            Assert.Equal(0.5, est.GetProbLessThan(between));
            Assert.Equal(second, est.GetQuantile(2.0 / 3));
            Assert.Equal(1.0, est.GetProbLessThan(next));
            Assert.Equal(next, est.GetQuantile(1.0));
            CheckGetQuantile(est, est);
        }
Пример #3
0
        public void QuantileEstimator_DuplicationTest()
        {
            double middle = 3.4;

            double[] x     = { 1.2, middle, middle, middle, 5.6 };
            var      outer = new OuterQuantiles(x);

            Assert.Equal(0.25, outer.GetProbLessThan(middle));
            Assert.Equal(outer.GetQuantile(0.3), middle);
            Assert.Equal(outer.GetQuantile(0.5), middle);
            Assert.Equal(outer.GetQuantile(0.7), middle);
            CheckGetQuantile(outer, outer);
            var inner = new InnerQuantiles(7, outer);

            Assert.Equal(0.25, inner.GetProbLessThan(middle));
            Assert.Equal(outer.GetQuantile(0.3), middle);
            Assert.Equal(outer.GetQuantile(0.5), middle);
            Assert.Equal(outer.GetQuantile(0.7), middle);
            CheckGetQuantile(inner, inner, 100 / 8, 100 * 7 / 8);
            var est = new QuantileEstimator(0.01);

            est.AddRange(x);
            Assert.Equal(0.25, est.GetProbLessThan(middle));
            Assert.Equal(est.GetQuantile(0.3), middle);
            Assert.Equal(est.GetQuantile(0.5), middle);
            Assert.Equal(est.GetQuantile(0.7), middle);
            CheckGetQuantile(est, est);
        }
Пример #4
0
        public void QuantileEstimator_SinglePointIsMedian()
        {
            QuantileEstimator est   = new QuantileEstimator(0.1);
            double            point = 2;

            est.Add(point);
            Assert.Equal(point, est.GetQuantile(0.5));
            Assert.Equal(0.0, est.GetProbLessThan(point));

            OuterQuantiles outer = new OuterQuantiles(new[] { point });

            Assert.Equal(point, outer.GetQuantile(0.5));
            Assert.Equal(0.0, outer.GetProbLessThan(point));

            InnerQuantiles inner = new InnerQuantiles(new[] { point });

            Assert.Equal(point, inner.GetQuantile(0.5));
            Assert.Equal(0.5, inner.GetProbLessThan(point));
        }
Пример #5
0
        public void QuantileSeedTest()
        {
            var seed = Rand.Int();

            double[] GetRandomQuantiles()
            {
                var rand      = new Random(seed);
                var estimator = new QuantileEstimator(rand.NextDouble());

                estimator.SetRandomSeed(rand.Next());

                var numbers =
                    Enumerable.Range(0, rand.Next(100))
                    .Select(x => rand.Next())
                    .ToArray();

                foreach (var item in numbers)
                {
                    estimator.Add(item, 1 + rand.Next(20));
                }

                var quantiles =
                    numbers
                    .Select(x => estimator.GetProbLessThan(x))
                    .ToArray();

                return(quantiles);
            }

            // Run the same estimation run twice with the same seed to test
            // that the results are the same.
            var firstRun  = GetRandomQuantiles();
            var secondRun = GetRandomQuantiles();

            Assert.Equal(firstRun, secondRun);
        }