//-- VMP ------------------------------------------------------------------------------------------------- /// <summary> /// Evidence message for VMP /// </summary> /// <returns>Zero</returns> /// <remarks><para> /// The formula for the result is <c>log(factor(logistic,x))</c>. /// Adding up these values across all factors and variables gives the log-evidence estimate for VMP. /// </para></remarks> //[Skip] public static double AverageLogFactor([Proper, SkipIfUniform] Gaussian x, Beta logistic, Beta to_logistic) { double m, v; x.GetMeanAndVariance(out m, out v); double l1pe = v == 0 ? MMath.Log1PlusExp(m) : MMath.Log1PlusExpGaussian(m, v); return((logistic.TrueCount - 1.0) * (m - l1pe) + (logistic.FalseCount - 1.0) * (-l1pe) - logistic.GetLogNormalizer() - to_logistic.GetAverageLog(logistic)); }
/// <summary>Evidence message for VMP.</summary> /// <param name="sample">Incoming message from <c>sample</c>.</param> /// <param name="logOdds">Incoming message from <c>logOdds</c>. Must be a proper distribution. If uniform, the result will be uniform.</param> /// <returns>Average of the factor's log-value across the given argument distributions.</returns> /// <remarks> /// <para>The formula for the result is <c>sum_(sample,logOdds) p(sample,logOdds) log(factor(sample,logOdds))</c>. Adding up these values across all factors and variables gives the log-evidence estimate for VMP.</para> /// </remarks> /// <exception cref="ImproperMessageException"> /// <paramref name="logOdds" /> is not a proper distribution.</exception> public static double AverageLogFactor(Bernoulli sample, [Proper, SkipIfUniform] Gaussian logOdds) { // f(sample,logOdds) = exp(sample*logOdds)/(1 + exp(logOdds)) // log f(sample,logOdds) = sample*logOdds - log(1 + exp(logOdds)) double m, v; logOdds.GetMeanAndVariance(out m, out v); return(sample.GetProbTrue() * m - MMath.Log1PlusExpGaussian(m, v)); }
/// <summary> /// VMP message to 'logistic' /// </summary> /// <param name="x">Incoming message from 'x'. Must be a proper distribution. If uniform, the result will be uniform.</param> /// <returns>The outgoing VMP message to the 'logistic' argument</returns> /// <remarks><para> /// The outgoing message is a distribution matching the moments of 'logistic' as the random arguments are varied. /// The formula is <c>proj[sum_(x) p(x) factor(logistic,x)]</c>. /// </para></remarks> /// <exception cref="ImproperMessageException"><paramref name="x"/> is not a proper distribution</exception> public static Beta LogisticAverageLogarithm([Proper] Gaussian x) { double m, v; x.GetMeanAndVariance(out m, out v); #if true // for consistency with XAverageLogarithm double eLogOneMinusP = BernoulliFromLogOddsOp.AverageLogFactor(false, x); #else // E[log (1-sigma(x))] = E[log sigma(-x)] = -E[log(1+exp(x))] double eLogOneMinusP = -MMath.Log1PlusExpGaussian(m, v); #endif // E[log sigma(x)] = -E[log(1+exp(-x))] = -E[log(1+exp(x))-x] = -E[log(1+exp(x))] + E[x] double eLogP = eLogOneMinusP + m; return(Beta.FromMeanLogs(eLogP, eLogOneMinusP)); }