Beispiel #1
0
        public void RandWishart()
        {
            // multivariate Gamma
            double a = 2.7;
            int    d = 3;
            PositiveDefiniteMatrix mTrue = new PositiveDefiniteMatrix(d, d);

            mTrue.SetToIdentity();
            mTrue.SetToProduct(mTrue, a);
            LowerTriangularMatrix  L = new LowerTriangularMatrix(d, d);
            PositiveDefiniteMatrix X = new PositiveDefiniteMatrix(d, d);
            PositiveDefiniteMatrix m = new PositiveDefiniteMatrix(d, d);

            m.SetAllElementsTo(0);
            double s = 0;

            for (int i = 0; i < nsamples; i++)
            {
                Rand.Wishart(a, L);
                X.SetToProduct(L, L.Transpose());
                m = m + X;
                s = s + X.LogDeterminant();
            }
            double sTrue = 0;

            for (int i = 0; i < d; i++)
            {
                sTrue += MMath.Digamma(a - i * 0.5);
            }
            m.Scale(1.0 / nsamples);
            s = s / nsamples;

            Console.WriteLine("");
            Console.WriteLine("Multivariate Gamma");
            Console.WriteLine("-------------------");

            Console.WriteLine("m = \n{0}", m);
            double dError = m.MaxDiff(mTrue);

            if (dError > TOLERANCE)
            {
                Assert.True(false, String.Format("Wishart({0}) mean: (should be {0}*I), error = {1}", a, dError));
            }
            if (System.Math.Abs(s - sTrue) > TOLERANCE)
            {
                Assert.True(false, string.Format("E[logdet]: {0} (should be {1})", s, sTrue));
            }
        }