public GaussianPriorFactor(double mean, double variance, Variable<GaussianDistribution> variable) : base(String.Format("Prior value going to {0}", variable)) { _NewMessage = new GaussianDistribution(mean, Math.Sqrt(variance)); CreateVariableToMessageBinding(variable, new Message<GaussianDistribution>( GaussianDistribution.FromPrecisionMean(0, 0), "message from {0} to {1}", this, variable)); }
public static GaussianDistribution FromPrecisionMean(double precisionMean, double precision) { var gaussianDistribution = new GaussianDistribution(); gaussianDistribution.Precision = precision; gaussianDistribution.PrecisionMean = precisionMean; gaussianDistribution.Variance = 1.0/precision; gaussianDistribution.StandardDeviation = Math.Sqrt(gaussianDistribution.Variance); gaussianDistribution.Mean = gaussianDistribution.PrecisionMean/gaussianDistribution.Precision; return gaussianDistribution; }
public GaussianDistribution Clone() { var result = new GaussianDistribution(); result.Mean = Mean; result.StandardDeviation = StandardDeviation; result.Variance = Variance; result.Precision = Precision; result.PrecisionMean = PrecisionMean; return result; }
public void LogProductNormalizationTests() { // Verified with Ralf Herbrich's F# implementation var standardNormal = new GaussianDistribution(0, 1); var lpn = GaussianDistribution.LogProductNormalization(standardNormal, standardNormal); Assert.AreEqual(-1.2655121234846454, lpn, ErrorTolerance); var m1s2 = new GaussianDistribution(1, 2); var m3s4 = new GaussianDistribution(3, 4); var lpn2 = GaussianDistribution.LogProductNormalization(m1s2, m3s4); Assert.AreEqual(-2.5168046699816684, lpn2, ErrorTolerance); }
public void DivisionTests() { // Since the multiplication was worked out by hand, we use the same numbers but work backwards var product = new GaussianDistribution(0.2, 3.0 / Math.Sqrt(10)); var standardNormal = new GaussianDistribution(0, 1); var productDividedByStandardNormal = product / standardNormal; Assert.AreEqual(2.0, productDividedByStandardNormal.Mean, ErrorTolerance); Assert.AreEqual(3.0, productDividedByStandardNormal.StandardDeviation, ErrorTolerance); Func<double, double> square = x => x * x; var product2 = new GaussianDistribution((4 * square(7) + 6 * square(5)) / (square(5) + square(7)), Math.Sqrt(((square(5) * square(7)) / (square(5) + square(7))))); var m4s5 = new GaussianDistribution(4,5); var product2DividedByM4S5 = product2 / m4s5; Assert.AreEqual(6.0, product2DividedByM4S5.Mean, ErrorTolerance); Assert.AreEqual(7.0, product2DividedByM4S5.StandardDeviation, ErrorTolerance); }
public static Rating GetPartialUpdate(Rating prior, Rating fullPosterior, double updatePercentage) { var priorGaussian = new GaussianDistribution(prior.Mean, prior.StandardDeviation); var posteriorGaussian = new GaussianDistribution(fullPosterior.Mean, fullPosterior.StandardDeviation); // From a clarification email from Ralf Herbrich: // "the idea is to compute a linear interpolation between the prior and posterior skills of each player // ... in the canonical space of parameters" double precisionDifference = posteriorGaussian.Precision - priorGaussian.Precision; double partialPrecisionDifference = updatePercentage*precisionDifference; double precisionMeanDifference = posteriorGaussian.PrecisionMean - priorGaussian.PrecisionMean; double partialPrecisionMeanDifference = updatePercentage*precisionMeanDifference; GaussianDistribution partialPosteriorGaussion = GaussianDistribution.FromPrecisionMean( priorGaussian.PrecisionMean + partialPrecisionMeanDifference, priorGaussian.Precision + partialPrecisionDifference); return new Rating(partialPosteriorGaussion.Mean, partialPosteriorGaussion.StandardDeviation, prior._ConservativeStandardDeviationMultiplier); }
public void MultiplicationTests() { // I verified this against the formula at http://www.tina-vision.net/tina-knoppix/tina-memo/2003-003.pdf var standardNormal = new GaussianDistribution(0, 1); var shiftedGaussian = new GaussianDistribution(2, 3); var product = standardNormal * shiftedGaussian; Assert.AreEqual(0.2, product.Mean, ErrorTolerance); Assert.AreEqual(3.0 / Math.Sqrt(10), product.StandardDeviation, ErrorTolerance); var m4s5 = new GaussianDistribution(4, 5); var m6s7 = new GaussianDistribution(6, 7); var product2 = m4s5 * m6s7; Func<double, double> square = x => x*x; var expectedMean = (4 * square(7) + 6 * square(5)) / (square(5) + square(7)); Assert.AreEqual(expectedMean, product2.Mean, ErrorTolerance); var expectedSigma = Math.Sqrt(((square(5) * square(7)) / (square(5) + square(7)))); Assert.AreEqual(expectedSigma, product2.StandardDeviation, ErrorTolerance); }
/// Computes the absolute difference between two Gaussians public static double AbsoluteDifference(GaussianDistribution left, GaussianDistribution right) { return Math.Max( Math.Abs(left.PrecisionMean - right.PrecisionMean), Math.Sqrt(Math.Abs(left.Precision - right.Precision))); }
public static double LogRatioNormalization(GaussianDistribution numerator, GaussianDistribution denominator) { if ((numerator.Precision == 0) || (denominator.Precision == 0)) { return 0; } double varianceDifference = denominator.Variance - numerator.Variance; double meanDifference = numerator.Mean - denominator.Mean; double logSqrt2Pi = Math.Log(Math.Sqrt(2*Math.PI)); return Math.Log(denominator.Variance) + logSqrt2Pi - Math.Log(varianceDifference)/2.0 + Square(meanDifference)/(2*varianceDifference); }
public static double LogProductNormalization(GaussianDistribution left, GaussianDistribution right) { if ((left.Precision == 0) || (right.Precision == 0)) { return 0; } double varianceSum = left.Variance + right.Variance; double meanDifference = left.Mean - right.Mean; double logSqrt2Pi = Math.Log(Math.Sqrt(2*Math.PI)); return -logSqrt2Pi - (Math.Log(varianceSum)/2.0) - (Square(meanDifference)/(2.0*varianceSum)); }
public void AbsoluteDifferenceTests() { // Verified with Ralf Herbrich's F# implementation var standardNormal = new GaussianDistribution(0, 1); var absDiff = GaussianDistribution.AbsoluteDifference(standardNormal, standardNormal); Assert.AreEqual(0.0, absDiff, ErrorTolerance); var m1s2 = new GaussianDistribution(1, 2); var m3s4 = new GaussianDistribution(3, 4); var absDiff2 = GaussianDistribution.AbsoluteDifference(m1s2, m3s4); Assert.AreEqual(0.4330127018922193, absDiff2, ErrorTolerance); }
public void LogRatioNormalizationTests() { // Verified with Ralf Herbrich's F# implementation var m1s2 = new GaussianDistribution(1, 2); var m3s4 = new GaussianDistribution(3, 4); var lrn = GaussianDistribution.LogRatioNormalization(m1s2, m3s4); Assert.AreEqual(2.6157405972171204, lrn, ErrorTolerance); }