示例#1
0
        /// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="BetaOp"]/message_doc[@name="MeanAverageLogarithm(Beta, Beta, Gamma, Beta)"]/*'/>
        public static Beta MeanAverageLogarithm([Proper] Beta prob, Beta mean, [Proper] Gamma totalCount, Beta to_mean)
        {
            // Calculate gradient using method for DirichletOp
            double ELogP, ELogOneMinusP;

            prob.GetMeanLogs(out ELogP, out ELogOneMinusP);
            Vector gradS = DirichletOp.CalculateGradientForMean(
                Vector.FromArray(new double[] { mean.TrueCount, mean.FalseCount }),
                totalCount,
                Vector.FromArray(new double[] { ELogP, ELogOneMinusP }));
            // Project onto a Beta distribution
            Matrix A = new Matrix(2, 2);
            double c = MMath.Trigamma(mean.TotalCount);

            A[0, 0] = MMath.Trigamma(mean.TrueCount) - c;
            A[1, 0] = A[0, 1] = -c;
            A[1, 1] = MMath.Trigamma(mean.FalseCount) - c;
            Vector theta             = GammaFromShapeAndRateOp.twoByTwoInverse(A) * gradS;
            Beta   approximateFactor = new Beta(theta[0] + 1, theta[1] + 1);

            if (damping == 0.0)
            {
                return(approximateFactor);
            }
            else
            {
                return((approximateFactor ^ (1 - damping)) * (to_mean ^ damping));
            }
        }
        /// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="BetaFromMeanAndTotalCountOp"]/message_doc[@name="TotalCountAverageLogarithm(Beta, Gamma, Beta, Gamma)"]/*'/>
        public static Gamma TotalCountAverageLogarithm([Proper] Beta mean, Gamma totalCount, [SkipIfUniform] Beta prob, Gamma to_totalCount)
        {
            prob.GetMeanLogs(out double ELogP, out double ELogOneMinusP);
            Gamma approximateFactor = DirichletOp.TotalCountAverageLogarithmHelper(
                Vector.FromArray(new double[] { mean.TrueCount, mean.FalseCount }),
                totalCount,
                Vector.FromArray(new double[] { ELogP, ELogOneMinusP }));

            if (damping == 0.0)
            {
                return(approximateFactor);
            }
            else
            {
                return((approximateFactor ^ (1 - damping)) * (to_totalCount ^ damping));
            }
        }
示例#3
0
        public void DirichletOpQuadratureTest()
        {
            var matlabResults
                = new double[]
                {
                0.625872049875551,
                0.866057568760984,
                -0.266065360660541,
                -1.227320719860393,
                1.280900246404125
                };
            var matlabResults2
                = new double[]
                {
                0.843302107208523,
                0.610546297106219,
                -2.182481855300747,
                -0.254011377373013,
                -0.217430057568389
                };
            double    am          = 2;
            double    bm          = 1;
            double    at          = 3;
            double    bt          = 1;
            Dirichlet meanQ       = new Dirichlet(new double[] { am, bm });
            Gamma     totalCountQ = new Gamma(at, 1 / bt);

            double[] EELogGamma;
            double[] EELogMLogGamma;
            double[] EELogOneMinusMLogGamma;
            double[] EELogSLogGamma;
            double[] EEMSDigamma;
            DirichletOp.MeanMessageExpectations(
                meanQ.PseudoCount,
                totalCountQ,
                out EELogGamma,
                out EELogMLogGamma,
                out EELogOneMinusMLogGamma);

            Console.WriteLine(System.Math.Abs(EELogGamma[0] - matlabResults[0]));
            Console.WriteLine(System.Math.Abs(EELogMLogGamma[0] - matlabResults[2]));
            Console.WriteLine(System.Math.Abs(EELogOneMinusMLogGamma[0] - matlabResults[3]));

            Console.WriteLine(System.Math.Abs(EELogGamma[1] - matlabResults2[0]));
            Console.WriteLine(System.Math.Abs(EELogMLogGamma[1] - matlabResults2[2]));
            Console.WriteLine(System.Math.Abs(EELogOneMinusMLogGamma[1] - matlabResults2[3]));

            DirichletOp.TotalCountMessageExpectations(
                meanQ.PseudoCount,
                totalCountQ,
                out EELogGamma,
                out EELogSLogGamma,
                out EEMSDigamma);

            Console.WriteLine(System.Math.Abs(EELogGamma[0] - matlabResults[0]));
            Console.WriteLine(System.Math.Abs(EELogSLogGamma[0] - matlabResults[1]));
            Console.WriteLine(System.Math.Abs(EEMSDigamma[0] - matlabResults[4]));

            Console.WriteLine(System.Math.Abs(EELogGamma[1] - matlabResults2[0]));
            Console.WriteLine(System.Math.Abs(EELogSLogGamma[1] - matlabResults2[1]));
            Console.WriteLine(System.Math.Abs(EEMSDigamma[1] - matlabResults2[4]));
        }