예제 #1
0
        /// <summary>
        /// Quantile function (inverse cumulative density function) of the specified distribution.
        /// Calculated for +/- 4 standard deviations
        /// </summary>
        /// <param name="gaussian">The distribution.</param>
        /// <param name="y">The y.</param>
        /// <param name="steps">The steps.</param>
        /// <returns>
        /// The <see cref="double" />.
        /// </returns>
        /// <exception cref="System.ArgumentOutOfRangeException">y should be in the interval [0, 1]</exception>
        public static double InverseCumulativeDistributionFunction(this Gaussian gaussian, double y, int steps = 1001)
        {
            if (y < 0.0 || y > 1.0)
            {
                throw new ArgumentOutOfRangeException("y");
            }

            double xmin  = gaussian.GetMean() - (4 * Math.Sqrt(gaussian.GetVariance()));
            double xmax  = gaussian.GetMean() + (4 * Math.Sqrt(gaussian.GetVariance()));
            double delta = (xmax - xmin) / (steps - 1);
            double lastx = double.NegativeInfinity;

            for (int i = 0; i < steps; i++)
            {
                double x = xmin + (delta * i);

                if (gaussian.CumulativeDistributionFunction(x) > y)
                {
                    return(lastx);
                }

                lastx = x;
            }

            return(double.PositiveInfinity);
        }
예제 #2
0
        /// <summary>
        /// The probability density function demo.
        /// </summary>
        public void ProbabilityDensityFunctionDemo()
        {
            var height = new Gaussian(1.84, 0.0001);

            outputter.Out(SteppedGaussian(height, new RealRange {
                Min = 1.8, Max = 1.9, Steps = 11
            }).ToArray(),
                          Contents.S6LearningTheGuessProbabilities.NumberedName,
                          "PDF Demo",
                          "HeightDiscrete");
            outputter.Out(new RealRange {
                Min = 1.8, Max = 1.9, Steps = 1000
            }.Values.Select(x => new Point(x, Math.Exp(height.GetLogProb(x)))).ToArray(),
                          Contents.S6LearningTheGuessProbabilities.NumberedName,
                          "PDF Demo",
                          "HeightContinuous");
            outputter.Out(height,
                          Contents.S6LearningTheGuessProbabilities.NumberedName,
                          "PDF Demo",
                          "Height");

            Console.WriteLine($@"Area of shaded region in the continuous plot: {height.CumulativeDistributionFunction(1.845) - height.CumulativeDistributionFunction(1.835)}");

            //// Second method using integration of pdf
            // Func<double, double> pdf = x => Math.Exp(height.GetLogProb(x));
            // Console.WriteLine("Area of shaded region: {0}", pdf.Integrate(1.835, 1.845, 500));
        }
예제 #3
0
        /// <summary>
        /// Stepped gaussian.
        /// </summary>
        /// <param name="gaussian">The gaussian.</param>
        /// <param name="range">The range.</param>
        /// <returns>The points.</returns>
        private IEnumerable <Point> SteppedGaussian(Gaussian gaussian, RealRange range)
        {
            var steps = new List <Point>();

            double sum = 0.0;

            var xvals = range.Values.ToArray();

            for (int i = 0; i < range.Count; i++)
            {
                double x1 = xvals[i] - (range.StepSize / 2);
                double x2 = xvals[i] + (range.StepSize / 2);

                double d = gaussian.CumulativeDistributionFunction(x2) - gaussian.CumulativeDistributionFunction(x1);

                if (i == 0)
                {
                    x1 = range.Min;
                }

                if (i == range.Count - 1)
                {
                    x2 = range.Max;
                }

                steps.Add(new Point(x1, 0));
                steps.Add(new Point(x1, d));
                steps.Add(new Point(x2, d));
                steps.Add(new Point(x2, 0));
                sum += d;
            }

            Console.WriteLine($@"The sum of the probabilities in the stepped plot is {sum}");

            return(steps);
        }
예제 #4
0
        public void TestNormalCDF()
        {
            const double Epsilon = 1e-5;

            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(double.NegativeInfinity), 0.0);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(double.MinValue), 0.0);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(0), 0.5, Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(double.MaxValue), 1.0);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(double.PositiveInfinity), 1.0);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(1), 1 - standardGaussian.CumulativeDistributionFunction(-1), Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(1) - standardGaussian.CumulativeDistributionFunction(-1), 0.682689492137, Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(2) - standardGaussian.CumulativeDistributionFunction(-2), 0.954499736104, Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(3) - standardGaussian.CumulativeDistributionFunction(-3), 0.997300203937, Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(4) - standardGaussian.CumulativeDistributionFunction(-4), 0.999936657516, Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(5) - standardGaussian.CumulativeDistributionFunction(-5), 0.999999426697, Epsilon);
            Assert.AreEqual(standardGaussian.CumulativeDistributionFunction(6) - standardGaussian.CumulativeDistributionFunction(-6), 0.999999998027, Epsilon);
        }