/// <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); }
/// <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)); }
/// <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); }
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); }