Пример #1
0
        public void InnerQuantiles_GetProbLessThan_IsIncreasing()
        {
            var quantiles      = new double[] { -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.166666666666667, -7.0149625935162021, -6.741895261845384, -6.4688279301745659, -6.1957605985037265, -5.9226932668329084, -5.64962593516209, -5.3765586034912722, -5.1034912718204541, -4.8304239401496138, -4.5573566084787958, -4.2842892768079777, -4.01122194513716, -3.738154613466341, -3.4650872817955016, -3.1920199501246835, -2.9189526184538654, -2.6458852867830256, -2.3728179551122075, -2.0997506234413894, -1.8266832917705711, -1.553615960099753, -1.2805486284289136, -1.0074812967580955, -0.7344139650872773, -0.46134663341645915, -0.18827930174564103, 0.084788029925200167, 0.35785536159601822, 0.63092269326683625, 0.903990024937654, 1.1770573566084719, 1.4501246882793115, 1.7231920199501294, 1.996259351620969, 2.2693266832917867, 2.5423940149626052, 2.8154613466334251, 3.0885286783042427, 3.3615960099750803, 3.6346633416458989, 3.9077306733167165, 4.1807980049875351, 4.4538653366583523, 4.7269326683291935 };
            var innerQuantiles = new InnerQuantiles(quantiles);

            const double left      = -7.1666666666666679;
            const double right     = -7.166666666666667;
            double       probLeft  = innerQuantiles.GetProbLessThan(left);
            double       probRight = innerQuantiles.GetProbLessThan(right);

            Assert.True(left < right, "It is given that left < right");
            Assert.True(probLeft <= probRight, "CDF must be non-decreasing");
        }
Пример #2
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);
        }
Пример #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, (int)Math.Ceiling(100.0 / 8), (int)Math.Floor(100.0 * 7 / 8));
            var est = new QuantileEstimator(0.01);

            est.AddRange(x);
            Assert.Equal(est.GetQuantile(0.3), middle);
            Assert.Equal(est.GetQuantile(0.5), middle);
            // InterpolationType==1 returns NextDouble(middle)
            Assert.Equal(est.GetQuantile(0.7), middle, 1e-15);
            CheckGetQuantile(est, est);
        }
Пример #4
0
        public void QuantileTest()
        {
            // draw many samples from N(m,v)
            Rand.Restart(0);
            int           n      = 10000;
            double        m      = 2;
            double        stddev = 3;
            Gaussian      prior  = new Gaussian(m, stddev * stddev);
            List <double> x      = new List <double>();

            for (int i = 0; i < n; i++)
            {
                x.Add(prior.Sample());
            }
            x.Sort();
            var sortedData = new OuterQuantiles(x.ToArray());

            // compute quantiles
            var quantiles = new InnerQuantiles(100, sortedData);

            // loop over x's and compare true quantile rank
            var    testPoints = EpTests.linspace(MMath.Min(x) - stddev, MMath.Max(x) + stddev, 100);
            double maxError   = 0;

            foreach (var testPoint in testPoints)
            {
                var trueRank = MMath.NormalCdf((testPoint - m) / stddev);
                var estRank  = quantiles.GetProbLessThan(testPoint);
                var error    = System.Math.Abs(trueRank - estRank);
                //Trace.WriteLine($"{testPoint} trueRank={trueRank} estRank={estRank} error={error}");
                Assert.True(error < 0.02);
                maxError = System.Math.Max(maxError, error);

                double estQuantile = quantiles.GetQuantile(estRank);
                error = MMath.AbsDiff(estQuantile, testPoint, 1e-8);
                //Trace.WriteLine($"{testPoint} estRank={estRank} estQuantile={estQuantile} error={error}");
                Assert.True(error < 1e-8);

                estRank = sortedData.GetProbLessThan(testPoint);
                error   = System.Math.Abs(trueRank - estRank);
                //Trace.WriteLine($"{testPoint} trueRank={trueRank} estRank={estRank} error={error}");
                Assert.True(error < 0.02);
            }
            //Trace.WriteLine($"max rank error = {maxError}");
        }
Пример #5
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));
        }