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));
            }
        }
Beispiel #2
0
        public void RandNormalP()
        {
            double[] m_init = { 1, 2, 3 };
            Vector   mt     = Vector.FromArray(m_init);

            double[,] v_init = { { 2, 1, 1 }, { 1, 2, 1 }, { 1, 1, 2 } };
            PositiveDefiniteMatrix vt = new PositiveDefiniteMatrix(v_init);
            PositiveDefiniteMatrix pt = ((PositiveDefiniteMatrix)vt.Clone()).SetToInverse(vt);

            int    d = mt.Count;
            Vector x = Vector.Zero(d);
            VectorMeanVarianceAccumulator mva = new VectorMeanVarianceAccumulator(d);

            for (int i = 0; i < nsamples; i++)
            {
                Rand.NormalP(mt, pt, x);
                mva.Add(x);
            }
            Vector m = mva.Mean;
            PositiveDefiniteMatrix v = mva.Variance;

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

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

            if (dError > TOLERANCE)
            {
                Assert.True(false, String.Format("m: error = {0}", dError));
            }

            Console.WriteLine("v = \n{0}", v);
            dError = v.MaxDiff(vt);
            if (dError > TOLERANCE)
            {
                Assert.True(false, String.Format("v: error = {0}", dError));
            }
        }