Inheritance: UnivariateDiscreteDistribution
Esempio n. 1
0
        public void FitTest()
        {
            PoissonDistribution target = new PoissonDistribution(0);
            double[] observations = { 0.2, 0.7, 1.0, 0.33 };
            
            target.Fit(observations);

            double expected = 0.5575;
            Assert.AreEqual(expected, target.Mean);
        }
Esempio n. 2
0
        public void ConstructorTest()
        {
            // Create a new Poisson distribution with 
            var dist = new PoissonDistribution(lambda: 4.2);

            // Common measures
            double mean = dist.Mean;     // 4.2
            double median = dist.Median; // 4.0
            double var = dist.Variance;  // 4.2

            // Cumulative distribution functions
            double cdf = dist.DistributionFunction(k: 2);               // 0.39488100648845126
            double ccdf = dist.ComplementaryDistributionFunction(k: 2); // 0.60511899351154874

            // Probability mass functions
            double pmf1 = dist.ProbabilityMassFunction(k: 4); // 0.19442365170822165
            double pmf2 = dist.ProbabilityMassFunction(k: 5); // 0.1633158674349062
            double pmf3 = dist.ProbabilityMassFunction(k: 6); // 0.11432110720443435
            double lpmf = dist.LogProbabilityMassFunction(k: 2); // -2.0229781299813

            // Quantile function
            int icdf1 = dist.InverseDistributionFunction(p: 0.17); // 2
            int icdf2 = dist.InverseDistributionFunction(p: 0.46); // 4
            int icdf3 = dist.InverseDistributionFunction(p: 0.87); // 7

            // Hazard (failure rate) functions
            double hf = dist.HazardFunction(x: 4); // 0.19780423301883465
            double chf = dist.CumulativeHazardFunction(x: 4); // 0.017238269667812049

            // String representation
            string str = dist.ToString(CultureInfo.InvariantCulture); // "Poisson(x; λ = 4.2)"


            // Median bounds
            // (http://en.wikipedia.org/wiki/Poisson_distribution#Median)

            Assert.IsTrue(median < 4.2 + 1 / 3.0);
            Assert.IsTrue(4.2 - System.Math.Log(2) <= median);

            Assert.AreEqual(4.2, mean);
            Assert.AreEqual(4.0, median);
            Assert.AreEqual(4.2, var);
            Assert.AreEqual(0.017238269667812049, chf, 1e-10);
            Assert.AreEqual(0.39488100648845126, cdf);
            Assert.AreEqual(0.19442365170822165, pmf1);
            Assert.AreEqual(0.1633158674349062, pmf2);
            Assert.AreEqual(0.11432110720443435, pmf3);
            Assert.AreEqual(-2.0229781299813, lpmf);
            Assert.AreEqual(0.19780423301883465, hf);
            Assert.AreEqual(0.60511899351154874, ccdf);
            Assert.AreEqual(2, icdf1);
            Assert.AreEqual(4, icdf2);
            Assert.AreEqual(7, icdf3);
            Assert.AreEqual("Poisson(x; λ = 4.2)", str);
        }
        public void RankDistribution()
        {
            // Create a new distribution, such as a Poisson
            var poisson = new PoissonDistribution(lambda: 0.42);

            // Draw enough samples from it
            double[] samples = poisson.Generate(1000000).ToDouble();

            // Let's pretend we don't know from which distribution
            // those sample come from, and create an analysis object
            // to check it for us:
            var analysis = new DistributionAnalysis(samples);

            // Compute the analysis
            analysis.Compute();

            // Get the most likely distribution
            var mostLikely = analysis.GoodnessOfFit[0];

            // The result should be Poisson(x; λ = 0.420961)
            var result = mostLikely.Distribution.ToString();

            Assert.AreEqual("Poisson(x; λ = 0.420961)", result);
        }
        public void ConstructorTest()
        {
            // Create a new Poisson distribution with 
            var dist = new PoissonDistribution(lambda: 4.2);

            // Common measures
            double mean = dist.Mean;     // 4.2
            double median = dist.Median; // 4.0
            double var = dist.Variance;  // 4.2

            // Cumulative distribution functions
            double cdf1 = dist.DistributionFunction(k: 2); // 0.21023798702309743
            double cdf2 = dist.DistributionFunction(k: 4); // 0.58982702131057763
            double cdf3 = dist.DistributionFunction(k: 7); // 0.93605666027257894
            double ccdf = dist.ComplementaryDistributionFunction(k: 2); // 0.78976201297690252

            // Probability mass functions
            double pmf1 = dist.ProbabilityMassFunction(k: 4); // 0.19442365170822165
            double pmf2 = dist.ProbabilityMassFunction(k: 5); // 0.1633158674349062
            double pmf3 = dist.ProbabilityMassFunction(k: 6); // 0.11432110720443435
            double lpmf = dist.LogProbabilityMassFunction(k: 2); // -2.0229781299813

            // Quantile function
            int icdf1 = dist.InverseDistributionFunction(p: cdf1); // 2
            int icdf2 = dist.InverseDistributionFunction(p: cdf2); // 4
            int icdf3 = dist.InverseDistributionFunction(p: cdf3); // 7

            // Hazard (failure rate) functions
            double hf = dist.HazardFunction(x: 4); // 0.47400404660843515
            double chf = dist.CumulativeHazardFunction(x: 4); // 0.89117630901575073

            // String representation
            string str = dist.ToString(CultureInfo.InvariantCulture); // "Poisson(x; λ = 4.2)"


            // Median bounds
            // (http://en.wikipedia.org/wiki/Poisson_distribution#Median)

            double max = 4.2 + 1 / 3.0;
            double min = 4.2 - System.Math.Log(2);
            Assert.IsTrue(median < max);
            Assert.IsTrue(min <= median);

            Assert.AreEqual(4.2, mean);
            Assert.AreEqual(4.0, median);
            Assert.AreEqual(4.2, var);
            Assert.AreEqual(0.89117630901575073, chf, 1e-10);
            Assert.AreEqual(0.21023798702309743, cdf1);
            Assert.AreEqual(0.58982702131057763, cdf2);
            Assert.AreEqual(0.93605666027257894, cdf3);
            Assert.AreEqual(0.19442365170822165, pmf1);
            Assert.AreEqual(0.1633158674349062, pmf2);
            Assert.AreEqual(0.11432110720443435, pmf3);
            Assert.AreEqual(-2.0229781299813, lpmf);
            Assert.AreEqual(0.47400404660843515, hf);
            Assert.AreEqual(0.89117630901575073, chf);
            Assert.AreEqual(0.78976201297690252, ccdf);
            Assert.AreEqual(2, icdf1);
            Assert.AreEqual(4, icdf2);
            Assert.AreEqual(7, icdf3);
            Assert.AreEqual("Poisson(x; λ = 4.2)", str);

            var range1 = dist.GetRange(0.95);
            var range2 = dist.GetRange(0.99);
            var range3 = dist.GetRange(0.01);

            Assert.AreEqual(1, range1.Min);
            Assert.AreEqual(8, range1.Max);
            Assert.AreEqual(0, range2.Min);
            Assert.AreEqual(10, range2.Max);
            Assert.AreEqual(0, range3.Min);
            Assert.AreEqual(10, range3.Max);
        }
        public void GenerateTest2()
        {
            double lambda = 1.11022302462516E-16;
            var target = new PoissonDistribution(lambda) as ISampleableDistribution<double>;

            double[] values = new double[10000];
            for (int i = 0; i < values.Length; i++)
                values[i] = target.Generate();

            for (int i = 0; i < values.Length; i++)
                Assert.AreEqual(0, values[i]);
        }
 public void MedianTest()
 {
     for (int i = 0; i < 25; i++)
     {
         var target = new PoissonDistribution(i + 1);
         Assert.AreEqual(target.Median, target.InverseDistributionFunction(0.5));
     }
 }
        public void LogProbabilityDensityFunctionTest()
        {
            PoissonDistribution target = new PoissonDistribution(25);

            double actual = target.LogProbabilityMassFunction(20);
            double expected = System.Math.Log(0.051917468608491321);

            Assert.AreEqual(expected, actual, 1e-10);
        }
        public void ProbabilityDensityFunctionTest()
        {
            PoissonDistribution target = new PoissonDistribution(25);

            double actual = target.ProbabilityMassFunction(20);
            double expected = 0.051917468608491321;

            Assert.AreEqual(expected, actual);
        }
        public void ConstructorTest2()
        {
            // Create a new Poisson distribution with lambda = 0.7
            PoissonDistribution poisson = new PoissonDistribution(0.7);

            double mean = poisson.Mean;                // 0.7    (lambda) 
            double median = poisson.Median;            // 1.0
            double mode = poisson.Mode;                // 0.7    (lambda)  
            double stdDev = poisson.StandardDeviation; // 0.836  [sqrt((lambda))]
            double var = poisson.Variance;             // 0.7    (lambda) 

            // The cumulative distribution function, or the probability that a real-valued 
            // random variable will be found to have a value less than or equal to some x:
            double cdf = poisson.DistributionFunction(k: 1);        // 0.84419501644539618

            // The probability density function, or the relative likelihood for a real-valued 
            // random variable will be found to take on a given specific value of x:
            double pdf = poisson.ProbabilityMassFunction(k: 1);  // 0.34760971265398666

            // The log of the probability density function, useful for applications where
            // precision is critical
            double lpdf = poisson.LogProbabilityMassFunction(k: 1); // -1.0566749439387324

            // The complementary distribution function, or the tail function, that gives the
            // probability that a real-valued random variable will be found to have a value 
            // greater than some x. This function is also known as the Survival function.
            double ccdf = poisson.ComplementaryDistributionFunction(k: 1); // 0.15580498355460382

            // The inverse distribution function, or the Quantile function, that is able to
            // revert probability values back to the real value that produces that probability
            int icdf = poisson.InverseDistributionFunction(p: cdf); // 1

            // The Hazard function, or the failure rate, the event rate at time t conditional 
            // on survival until time t or later. Note that this function may only make sense
            // when using time-defined distributions, such as the Poisson.
            double hf = poisson.HazardFunction(x: 1);            // 2.2310564445595058

            // The cumulative hazard function, that gives how much the hazard 
            // function accumulated over time until a given time instant x.
            double chf = poisson.CumulativeHazardFunction(x: 1); // 1.8591501591854034

            // Every distribution has a friendly string representation
            string str = poisson.ToString(System.Globalization.CultureInfo.InvariantCulture); // Poisson(x; λ = 0.7)

            Assert.AreEqual(0.84419501644539618, cdf);
            Assert.AreEqual(0.34760971265398666, pdf);
            Assert.AreEqual(-1.0566749439387324, lpdf);
            Assert.AreEqual(0.15580498355460382, ccdf);
            Assert.AreEqual(1, icdf);
            Assert.AreEqual(2.2310564445595058, hf);
            Assert.AreEqual(1.8591501591854034, chf);
            Assert.AreEqual("Poisson(x; λ = 0.7)", str);

            Assert.AreEqual(0.7, mean);
            Assert.AreEqual(0.7, mode);
            Assert.AreEqual(1, median);
            Assert.AreEqual(0.7, var);
            Assert.AreEqual(0.83666002653407556, stdDev);
        }
        public void DistributionFunctionTest()
        {
            // Create a new Poisson distribution
            var dist = new PoissonDistribution(lambda: 4.2);

            // P(X = 1) = 0.0629814226460064
            double equal = dist.ProbabilityMassFunction(k: 1);

            // P(X < 1) = 0.0149955768204777
            double less = dist.DistributionFunction(k: 1, inclusive: false);

            // P(X ≤ 1) = 0.0779769994664841
            double lessThanOrEqual = dist.DistributionFunction(k: 1, inclusive: true);

            // P(X > 1) = 0.922023000533516
            double greater = dist.ComplementaryDistributionFunction(k: 1);

            // P(X ≥ 1) = 0.985004423179522
            double greaterThanOrEqual = dist.ComplementaryDistributionFunction(k: 1, inclusive: true);

            Assert.AreEqual(equal, 0.0629814226460064, 1e-10);
            Assert.AreEqual(less, 0.0149955768204777, 1e-10);
            Assert.AreEqual(lessThanOrEqual, 0.0779769994664841, 1e-10);
            Assert.AreEqual(greater, 0.922023000533516, 1e-10);
            Assert.AreEqual(greaterThanOrEqual, 0.985004423179522, 1e-10);
        }
Esempio n. 11
0
        private void DrawPoisson(Chart chart, KeyValuePair<int, double>[] dataSeries)
        {
            // Calculate Poisson mean
            int max = dataSeries[dataSeries.Length - 1].Key;
            double mean = metricHandler.ReadCountDistinctTotal / max;

            PoissonDistribution dist = new PoissonDistribution(lambda: mean);
            List<KeyValuePair<int, double>> dataSeries2 = new List<KeyValuePair<int, double>>();
            int i = 1;
            double pdf = 0;
            while (true)
            {
                pdf = dist.ProbabilityMassFunction(k: i);
                if (pdf == 0 || Double.IsNaN(pdf)) { break; }
                double val = pdf * 100;
                dataSeries2.Add(new KeyValuePair<int, double>(i, val));
                i += 2;
            }
            ((LineSeries)chart.Series[2]).ItemsSource = dataSeries2;
        }
        public void GenerateTest3()
        {
            double lambda = 0.75;
            var a = new PoissonDistribution(lambda) as ISampleableDistribution<double>;


            Accord.Math.Random.Generator.Seed = 0;
            double[] expected = a.Generate(samples: 10000);

            Accord.Math.Random.Generator.Seed = 0;
            var b = new PoissonDistribution(lambda);
            Accord.Math.Random.Generator.Seed = 0;
            int[] actual = b.Generate(10000);

            Assert.IsTrue(expected.IsEqual(actual));
        }