Beispiel #1
0
        public static Wishart SampleAverageConditional2(double shape, [Proper] Wishart rate, Wishart to_rate, Wishart result)
        {
            Wishart ratePost         = rate * to_rate;
            PositiveDefiniteMatrix r = ratePost.GetMean();

            return(WishartFromShapeAndRateOp.SampleAverageConditional(shape, r, result));
        }
Beispiel #2
0
        /// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="WishartFromShapeAndRateOp_Laplace2"]/message_doc[@name="RateAverageConditional(Wishart, double, Wishart, Wishart, Wishart)"]/*'/>
        public static Wishart RateAverageConditional([SkipIfUniform] Wishart sample, double shape, Wishart rate, Wishart to_rate, Wishart result)
        {
            if (sample.IsPointMass)
            {
                return(WishartFromShapeAndRateOp.RateAverageConditional(sample.Point, shape, result));
            }
            // f(Y,R) = |Y|^(a-c) |R|^a exp(-tr(YR))
            // p(Y) = |Y|^(a_y-c) exp(-tr(YB_y)
            // p(R) = |R|^(a_r-c) exp(-tr(RB_r)
            // int_Y f(Y,R) p(Y) dY = |R|^a |R+B_y|^-(a+a_y-c)
            int     dim                    = sample.Dimension;
            double  c                      = 0.5 * (dim + 1);
            double  shape2                 = shape - c + sample.Shape;
            Wishart ratePost               = rate * to_rate;
            PositiveDefiniteMatrix r       = ratePost.GetMean();
            PositiveDefiniteMatrix rby     = r + sample.Rate;
            PositiveDefiniteMatrix invrby  = rby.Inverse();
            PositiveDefiniteMatrix rInvrby = rby;

            rInvrby.SetToProduct(r, invrby);
            double xxddlogp              = Matrix.TraceOfProduct(rInvrby, rInvrby) * shape2;
            double delta                 = -xxddlogp / dim;
            PositiveDefiniteMatrix invR  = r.Inverse();
            PositiveDefiniteMatrix dlogp = invrby;

            dlogp.Scale(-shape2);
            LowerTriangularMatrix rChol = new LowerTriangularMatrix(dim, dim);

            rChol.SetToCholesky(r);
            result.SetDerivatives(rChol, invR, dlogp, xxddlogp, GammaFromShapeAndRateOp.ForceProper, shape);
            return(result);
        }