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