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