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);
        }
Example #6
0
        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);            
 }