예제 #1
0
        public void ProbabilityDensityFunctionTest2()
        {
            double[] mean = new double[64];
            double[,] covariance = Accord.Tests.Math.CholeskyDecompositionTest.bigmatrix;

            var target = new MultivariateNormalDistribution(mean, covariance);

            double expected = double.PositiveInfinity;
            double actual   = target.ProbabilityDensityFunction(mean);

            Assert.AreEqual(expected, actual, 0.00000001);

            expected = 1053.6344885618446;
            actual   = target.LogProbabilityDensityFunction(mean);
            Assert.AreEqual(expected, actual, 0.00000001);

            double[] x = Matrix.Diagonal(covariance).Multiply(1.5945e7);

            expected = 4.781042576287362e-12;
            actual   = target.ProbabilityDensityFunction(x);
            Assert.AreEqual(expected, actual, 1e-21);

            expected = System.Math.Log(4.781042576287362e-12);
            actual   = target.LogProbabilityDensityFunction(x);
            Assert.AreEqual(expected, actual, 1e-10);
        }
예제 #2
0
        public void ConstructorTest4()
        {
            // Create a multivariate Gaussian distribution
            var dist = new MultivariateNormalDistribution(

                // mean vector mu
                mean: new double[]
            {
                4, 2
            },

                // covariance matrix sigma
                covariance: new double[, ]
            {
                { 0.3, 0.1 },
                { 0.1, 0.7 }
            }
                );

            // Common measures
            double[] mean   = dist.Mean;     // { 4, 2 }
            double[] median = dist.Median;   // { 4, 2 }
            double[] var    = dist.Variance; // { 0.3, 0.7 } (diagonal from cov)
            double[,] cov = dist.Covariance; // { { 0.3, 0.1 }, { 0.1, 0.7 } }

            // Probability mass functions
            double pdf1 = dist.ProbabilityDensityFunction(new double[] { 2, 5 });
            double pdf2 = dist.ProbabilityDensityFunction(new double[] { 4, 2 });
            double pdf3 = dist.ProbabilityDensityFunction(new double[] { 3, 7 });
            double lpdf = dist.LogProbabilityDensityFunction(new double[] { 3, 7 });

            // Cumulative distribution function (for up to two dimensions)

            // compared against R package mnormt: install.packages("mnormt")
            // pmnorm(c(3,5), mean=c(4,2), varcov=matrix(c(0.3,0.1,0.1,0.7), 2,2))
            double cdf  = dist.DistributionFunction(new double[] { 3, 5 });
            double ccdf = dist.ComplementaryDistributionFunction(new double[] { 3, 5 });


            Assert.AreEqual(4, mean[0]);
            Assert.AreEqual(2, mean[1]);
            Assert.AreEqual(4, median[0]);
            Assert.AreEqual(2, median[1]);
            Assert.AreEqual(0.3, var[0]);
            Assert.AreEqual(0.7, var[1]);
            Assert.AreEqual(0.3, cov[0, 0]);
            Assert.AreEqual(0.1, cov[0, 1]);
            Assert.AreEqual(0.1, cov[1, 0]);
            Assert.AreEqual(0.7, cov[1, 1]);
            Assert.AreEqual(0.000000018917884164743237, pdf1);
            Assert.AreEqual(0.35588127170858852, pdf2);
            Assert.AreEqual(0.000000000036520107734505265, pdf3);
            Assert.AreEqual(-24.033158110192296, lpdf);
            Assert.AreEqual(0.033944035782101548, cdf);
        }
예제 #3
0
        private static void checkDegenerate(MultivariateNormalDistribution target)
        {
            Assert.AreEqual(1, target.Mean[0]);
            Assert.AreEqual(2, target.Mean[1]);
            Assert.AreEqual(0, target.Covariance[0, 0]);
            Assert.AreEqual(0, target.Covariance[0, 1]);
            Assert.AreEqual(0, target.Covariance[1, 0]);
            Assert.AreEqual(0, target.Covariance[1, 1]);


            // Common measures
            double[] mean   = target.Mean;     // { 1, 2 }
            double[] median = target.Median;   // { 4, 2 }
            double[] var    = target.Variance; // { 0.0, 0.0 } (diagonal from cov)
            double[,] cov = target.Covariance; // { { 0.0, 0.0 }, { 0.0, 0.0 } }

            // Probability mass functions
            double pdf1 = target.ProbabilityDensityFunction(new double[] { 1, 2 });
            double pdf2 = target.ProbabilityDensityFunction(new double[] { 4, 2 });
            double pdf3 = target.ProbabilityDensityFunction(new double[] { 3, 7 });
            double lpdf = target.LogProbabilityDensityFunction(new double[] { 3, 7 });

            // Cumulative distribution function (for up to two dimensions)
            double cdf1 = target.DistributionFunction(new double[] { 1, 2 });
            double cdf2 = target.DistributionFunction(new double[] { 3, 5 });

            double ccdf1 = target.ComplementaryDistributionFunction(new double[] { 1, 2 });
            double ccdf2 = target.ComplementaryDistributionFunction(new double[] { 3, 5 });


            Assert.AreEqual(1, mean[0]);
            Assert.AreEqual(2, mean[1]);
            Assert.AreEqual(1, median[0]);
            Assert.AreEqual(2, median[1]);
            Assert.AreEqual(0.0, var[0]);
            Assert.AreEqual(0.0, var[1]);
            Assert.AreEqual(0.0, cov[0, 0]);
            Assert.AreEqual(0.0, cov[0, 1]);
            Assert.AreEqual(0.0, cov[1, 0]);
            Assert.AreEqual(0.0, cov[1, 1]);
            Assert.AreEqual(0.15915494309189532, pdf1);
            Assert.AreEqual(0.15915494309189532, pdf2);
            Assert.AreEqual(0.15915494309189532, pdf3);
            Assert.AreEqual(-1.8378770664093456, lpdf);
            Assert.AreEqual(1.0, cdf1);
            Assert.AreEqual(0.0, cdf2);
            Assert.AreEqual(0.0, ccdf1);
            Assert.AreEqual(1.0, ccdf2);
        }
        public void CumulativeFunctionTest2()
        {
            double[] mean = { 4.2 };

            double[,] covariance = { { 1.4 } };

            var baseline = new NormalDistribution(4.2, System.Math.Sqrt(covariance[0, 0]));
            var target   = new MultivariateNormalDistribution(mean, covariance);

            for (int i = 0; i < 10; i++)
            {
                double x = (i - 2) / 10.0;

                {
                    double actual   = target.ProbabilityDensityFunction(x);
                    double expected = baseline.ProbabilityDensityFunction(x);
                    Assert.AreEqual(expected, actual, 1e-10);
                }

                {
                    double actual   = target.DistributionFunction(x);
                    double expected = baseline.DistributionFunction(x);
                    Assert.AreEqual(expected, actual);
                }

                {
                    double actual   = target.ComplementaryDistributionFunction(x);
                    double expected = baseline.ComplementaryDistributionFunction(x);
                    Assert.AreEqual(expected, actual);
                }
            }
        }
        public void FitTest3()
        {
            double[][] observations =
            {
                new double[] { 1, 2 },
                new double[] { 2, 4 },
                new double[] { 3, 6 },
                new double[] { 4, 8 }
            };


            var target = new MultivariateNormalDistribution(2);

            NormalOptions options = new NormalOptions()
            {
                Robust = true
            };

            target.Fit(observations, options);

            double pdf = target.ProbabilityDensityFunction(4, 2);
            double cdf = target.DistributionFunction(4, 2);
            bool   psd = target.Covariance.IsPositiveDefinite();

            Assert.AreEqual(0.043239154739844896, pdf);
            Assert.AreEqual(0.12263905840338646, cdf);
            Assert.IsFalse(psd);
        }
        public void CumulativeFunctionTest1()
        {
            // Comparison against dmvnorm from the mvtnorm R package

            double[] mean = { 1, -1 };

            double[,] covariance =
            {
                { 0.9, 0.4 },
                { 0.4, 0.3 },
            };

            var target = new MultivariateNormalDistribution(mean, covariance);

            double[] x = { 1.2, -0.8 };

            // dmvnorm(x=c(1.2, -0.8), mean=c(1, -1), sigma=matrix(c(0.9, 0.4, 0.4, 0.3), 2, 2))
            double pdf = target.ProbabilityDensityFunction(x);

            // pmvnorm(upper=c(1.2, -0.8), mean=c(1, -1), sigma=matrix(c(0.9, 0.4, 0.4, 0.3), 2, 2))
            double cdf = target.DistributionFunction(x);

            // pmvnorm(lower=c(1.2, -0.8), mean=c(1, -1), sigma=matrix(c(0.9, 0.4, 0.4, 0.3), 2, 2))
            double ccdf = target.ComplementaryDistributionFunction(x);

            Assert.AreEqual(0.44620942136345987, pdf);
            Assert.AreEqual(0.5049523013014460826, cdf, 1e-10);
            Assert.AreEqual(0.27896707550525140507, ccdf, 1e-10);
        }
예제 #7
0
        /// <summary>
        /// Calculates Renyi's quadratic entropy of a particle set (also used for JPDAF).
        /// </summary>
        /// <param name="particles">particle filter.</param>
        /// <param name="stateSelector">Particle state selector function (e.g. [x, y, vX, vY]).</param>
        /// <returns>Renyi's quadratic entropy of a particle set.</returns>
        public static double CalculateEntropy <TParticle>(this IEnumerable <TParticle> particles, Func <TParticle, double[]> stateSelector)
            where TParticle : class, IParticle
        {
            var nParticles = particles.Count();

            /***************** kernel function calculation ******************/
            var dKrnl = 4;
            var eKrnl = 1 / (4 + dKrnl);
            var hKrnl = System.Math.Pow(4 / (dKrnl + 2), eKrnl) * System.Math.Pow(nParticles, -eKrnl); //scaling param

            var states = particles.Select(x => stateSelector(x)).ToList();
            var kernel = states.ToMatrix().Covariance().Multiply(System.Math.Pow(hKrnl, dKrnl)); //particle filter kernel
            /***************** kernel function calculation ******************/

            var mean = new double[kernel.ColumnCount()];
            var normalDistribution = new MultivariateNormalDistribution(mean, kernel.Multiply(2));

            var entropy = 0d;

            for (int i = 0; i < nParticles; i++)
            {
                for (int j = 0; j < nParticles; j++)
                {
                    var stateDiff = states[i].Subtract(states[j]);
                    var kernelVal = normalDistribution.ProbabilityDensityFunction(stateDiff);

                    entropy += kernelVal;
                }
            }

            entropy = -System.Math.Log10(entropy / (nParticles * nParticles));
            return(entropy);
        }
예제 #8
0
        public void ConstructorTest4()
        {
            // Create a multivariate Gaussian distribution
            var dist = new MultivariateNormalDistribution(

                // mean vector mu
                mean: new double[]
            {
                4, 2
            },

                // covariance matrix sigma
                covariance: new double[, ]
            {
                { 0.3, 0.1 },
                { 0.1, 0.7 }
            }
                );

            // Common measures
            double[] mean   = dist.Mean;     // { 4, 2 }
            double[] median = dist.Median;   // { 4, 2 }
            double[] var    = dist.Variance; // { 0.3, 0.7 } (diagonal from cov)
            double[,] cov = dist.Covariance; // { { 0.3, 0.1 }, { 0.1, 0.7 } }

            // Probability mass functions
            double pdf1 = dist.ProbabilityDensityFunction(new double[] { 2, 5 });    // 0.000000018917884164743237
            double pdf2 = dist.ProbabilityDensityFunction(new double[] { 4, 2 });    // 0.35588127170858852
            double pdf3 = dist.ProbabilityDensityFunction(new double[] { 3, 7 });    // 0.000000000036520107734505265
            double lpdf = dist.LogProbabilityDensityFunction(new double[] { 3, 7 }); // -24.033158110192296


            Assert.AreEqual(4, mean[0]);
            Assert.AreEqual(2, mean[1]);
            Assert.AreEqual(4, median[0]);
            Assert.AreEqual(2, median[1]);
            Assert.AreEqual(0.3, var[0]);
            Assert.AreEqual(0.7, var[1]);
            Assert.AreEqual(0.3, cov[0, 0]);
            Assert.AreEqual(0.1, cov[0, 1]);
            Assert.AreEqual(0.1, cov[1, 0]);
            Assert.AreEqual(0.7, cov[1, 1]);
            Assert.AreEqual(0.000000018917884164743237, pdf1);
            Assert.AreEqual(0.35588127170858852, pdf2);
            Assert.AreEqual(0.000000000036520107734505265, pdf3);
            Assert.AreEqual(-24.033158110192296, lpdf);
        }
예제 #9
0
        public void ProbabilityFunctionTest4()
        {
            // https://code.google.com/p/accord/issues/detail?id=98

            /*
             *  mean = c(0.25, 0.082)
             *  sigma = matrix(c(0.0117, 0.0032}, 0.0032, 0.001062), 2, 2)
             *
             *  d = seq(0.03, 0.13, 0.0001)
             *  n <- length(d)
             *  r <- rep(0, n)
             *
             *  for (i in 1:n) {
             *    r[i] = dmnorm(c(0.25, d[i]), mean, sigma)
             *  }
             */

            var target = new MultivariateNormalDistribution(
                new[] { 0.25, 0.082 },
                new[, ] {
                { 0.0117, 0.0032 }, { 0.0032, 0.001062 }
            });

            double[] vec = { 0.25, -1d };

            double[] d      = Matrix.Vector(0.03, 0.13, 0.01);
            double[] actual = new double[d.Length];

            double[] expected =
            {
                0.07736363146686682512598,   0.95791683037271524447931,   6.94400533773376249513376,
                29.47023331179536498325433, 73.22314665629953367442795, 106.51345886810220520146686,
                90.70931216253406148553040, 45.22624649290145271152142,  13.20141558295499173425469,
                2.25601377127287250345944,   0.22571180597171525139544, 0.2257118059717152513954
            };

            for (int i = 0; i < d.Length; i++)
            {
                vec[1]    = d[i];
                actual[i] = target.ProbabilityDensityFunction(vec);
            }

            for (int i = 0; i < actual.Length; i++)
            {
                Assert.AreEqual(expected[i], actual[i], 1e-12);
            }

            for (int i = 0; i < d.Length; i++)
            {
                vec[1]    = d[i];
                actual[i] = System.Math.Exp(target.LogProbabilityDensityFunction(vec));
            }

            for (int i = 0; i < actual.Length; i++)
            {
                Assert.AreEqual(expected[i], actual[i], 1e-12);
            }
        }
예제 #10
0
        private static double[, ][] calculateZXMatrix <TFilter, TState, TMeasurement>(this IList <TFilter> kalmanFilters,
                                                                                      IList <TMeasurement> measurements,
                                                                                      out double[,] probsZX)
        where TFilter : KalmanFilter <TState, TMeasurement>
        {
            probsZX = new double[measurements.Count, kalmanFilters.Count];
            var innovZX = new double[measurements.Count, kalmanFilters.Count][];

            for (int tIdx = 0; tIdx < kalmanFilters.Count; tIdx++)
            {
                var kalman         = kalmanFilters[tIdx];
                var zeroCoordinate = new double[kalman.MeasurementVectorDimension];

                var mvnPDF = new MultivariateNormalDistribution(zeroCoordinate, kalman.ResidualCovariance);
                var mulCorrectionFactor = (double)1 / mvnPDF.ProbabilityDensityFunction(zeroCoordinate);

                for (int mIdx = 0; mIdx < measurements.Count; mIdx++)
                {
                    var measurement = measurements[mIdx];

                    //delta' / S^-1 * delta; this expression has ChiSquare distribution (Mahalanobis distance)
                    double[] delta; double mahalanobisDistancce;//not used
                    var      isInsideGate = kalman.IsMeasurementInsideGate(measurement, out delta, out mahalanobisDistancce);

                    innovZX[mIdx, tIdx] = delta;

                    if (isInsideGate)
                    {
                        probsZX[mIdx, tIdx] = mvnPDF.ProbabilityDensityFunction(delta) * mulCorrectionFactor; //modification (added mul correction factor)
                    }
                    //else probsZX[mIdx, tIdx] = 0 (by default)
                }
            }

            return(innovZX);
        }
        private static double[, ][] calculateZXMatrix <TFilter, TState, TMeasurement>(this IList <TFilter> kalmanFilters,
                                                                                      IList <TMeasurement> measurements,
                                                                                      out double[,] probsZX)
        where TFilter : KalmanFilter <TState, TMeasurement>
        {
            probsZX = new double[measurements.Count, kalmanFilters.Count];
            var innovZX = new double[measurements.Count, kalmanFilters.Count][];

            for (int tIdx = 0; tIdx < kalmanFilters.Count; tIdx++)
            {
                var kalman         = kalmanFilters[tIdx];
                var zeroCoordinate = new double[kalman.MeasurementVectorDimension];

                var mvnPDF = new MultivariateNormalDistribution(zeroCoordinate, kalman.CovarianceMatrix);
                var mulCorrectionFactor = (double)1 / mvnPDF.ProbabilityDensityFunction(zeroCoordinate);

                for (int mIdx = 0; mIdx < measurements.Count; mIdx++)
                {
                    var measurement = measurements[mIdx];

                    var delta = kalman.CalculatePredictionError(measurement);
                    innovZX[mIdx, tIdx] = delta;

                    //delta' / S^-1 * delta; this expression has ChiSquare distribution
                    var gate = delta.Multiply(kalman.CovarianceMatrixInv).Multiply(delta.Transpose()).Sum();

                    if (gate < gateThreshold)
                    {
                        probsZX[mIdx, tIdx] = mvnPDF.ProbabilityDensityFunction(delta) * mulCorrectionFactor; //modification (added mul correction factor)
                    }
                    //else probsZX[mIdx, tIdx] = 0 (by default)
                }
            }

            return(innovZX);
        }
예제 #12
0
        public void TestNormalDistribution2Dimensions4()
        {
            double[] mean = { 0, 0 };
            double[,] covarianceMatrix =
            {
                { 1.1, 1 },
                {   1, 1 }
            };
            double[] value = { 0.1, 0.1 };

            MultivariateNormalDistribution mnd = new MultivariateNormalDistribution(mean, covarianceMatrix);
            double expected = mnd.ProbabilityDensityFunction(value);

            double actual = MathHelper.GaussianDistribution(mean, covarianceMatrix, value);

            Assert.IsTrue(Math.Abs(expected - actual) < eps);
        }
예제 #13
0
        public void TestNormalDistribution2Dimensions2()
        {
            double[] mean = { -0.5, 9.0 };
            double[,] covarianceMatrix =
            {
                { 10.4,  7.9 },
                {  1.0, 17.4 }
            };
            double[] value = { -5.5, 4.0 };

            MultivariateNormalDistribution mnd = new MultivariateNormalDistribution(mean, covarianceMatrix);
            double expected = mnd.ProbabilityDensityFunction(value);

            double actual = MathHelper.GaussianDistribution(mean, covarianceMatrix, value);

            Assert.IsTrue(Math.Abs(expected - actual) < eps);
        }
        public void ProbabilityDensityFunctionTest()
        {
            double[] mean = { 1, -1 };
            double[,] covariance =
            {
                { 0.9, 0.4 },
                { 0.4, 0.3 },
            };

            var target = new MultivariateNormalDistribution(mean, covariance);

            double[] x        = { 1.2, -0.8 };
            double   expected = 0.446209421363460;
            double   actual   = target.ProbabilityDensityFunction(x);

            Assert.AreEqual(expected, actual, 0.00000001);
        }
예제 #15
0
        public void ToMultivariateTest()
        {
            double x    = 3;
            double mean = 7;
            double dev  = 5;

            NormalDistribution target = new NormalDistribution(mean, dev);

            MultivariateNormalDistribution multi =
                target.ToMultivariateDistribution();

            Assert.AreEqual(target.Mean, multi.Mean[0]);
            Assert.AreEqual(target.Variance, multi.Covariance[0, 0]);
            Assert.AreEqual(target.Variance, multi.Variance[0]);

            double expected = 0.0579383105522966;
            double actual   = multi.ProbabilityDensityFunction(x);

            Assert.IsFalse(double.IsNaN(actual));
            Assert.AreEqual(expected, actual, 1e-15);
        }
        public void ProbabilityDensityFunctionTest3()
        {
            double[] mean = new double[3];
            double[,] covariance = Matrix.Identity(3);

            var target = new MultivariateNormalDistribution(mean, covariance);

            double[] x = { 1.2, -0.8 };

            bool thrown = false;

            try
            {
                target.ProbabilityDensityFunction(x);
            }
            catch (DimensionMismatchException)
            {
                thrown = true;
            }

            Assert.IsTrue(thrown);
        }
예제 #17
0
        public void ConstructorTest1()
        {
            NormalDistribution             normal = new NormalDistribution(4.2, 1.2);
            MultivariateNormalDistribution target = new MultivariateNormalDistribution(new[] { 4.2 }, new[, ] {
                { 1.2 * 1.2 }
            });

            double[] mean   = target.Mean;
            double[] median = target.Median;
            double[] var    = target.Variance;
            double[,] cov = target.Covariance;

            double apdf1 = target.ProbabilityDensityFunction(new double[] { 2 });
            double apdf2 = target.ProbabilityDensityFunction(new double[] { 4 });
            double apdf3 = target.ProbabilityDensityFunction(new double[] { 3 });
            double alpdf = target.LogProbabilityDensityFunction(new double[] { 3 });
            double acdf  = target.DistributionFunction(new double[] { 3 });
            double accdf = target.ComplementaryDistributionFunction(new double[] { 3 });

            double epdf1 = target.ProbabilityDensityFunction(new double[] { 2 });
            double epdf2 = target.ProbabilityDensityFunction(new double[] { 4 });
            double epdf3 = target.ProbabilityDensityFunction(new double[] { 3 });
            double elpdf = target.LogProbabilityDensityFunction(new double[] { 3 });
            double ecdf  = target.DistributionFunction(new double[] { 3 });
            double eccdf = target.ComplementaryDistributionFunction(new double[] { 3 });


            Assert.AreEqual(normal.Mean, target.Mean[0]);
            Assert.AreEqual(normal.Median, target.Median[0]);
            Assert.AreEqual(normal.Variance, target.Variance[0]);
            Assert.AreEqual(normal.Variance, target.Covariance[0, 0]);

            Assert.AreEqual(epdf1, apdf1);
            Assert.AreEqual(epdf2, apdf2);
            Assert.AreEqual(epdf3, apdf3);
            Assert.AreEqual(elpdf, alpdf);
            Assert.AreEqual(ecdf, acdf);
            Assert.AreEqual(eccdf, accdf);
            Assert.AreEqual(1.0 - ecdf, eccdf);
        }
예제 #18
0
 public double evaluate(double[] x)
 {
     return(probModel.ProbabilityDensityFunction(x));
 }