public void MaxTest() { Gaussian actual, expected; actual = MaxGaussianOp.MaxAverageConditional(Gaussian.FromNatural(6053.7946407740192, 2593.4559834344436), Gaussian.FromNatural(-1.57090676324773, 1.3751262174888785), Gaussian.FromNatural(214384.78500926663, 96523.508973471908)); Assert.False(actual.IsProper()); actual = MaxGaussianOp.MaxAverageConditional(Gaussian.FromNatural(146.31976467723146, 979.371757950659), Gaussian.FromNatural(0.075442729439046508, 0.086399540048904114), Gaussian.PointMass(0)); Assert.False(actual.IsProper()); actual = MaxGaussianOp.MaxAverageConditional(Gaussian.Uniform(), Gaussian.PointMass(0), new Gaussian(-7.357e+09, 9.75)); expected = Gaussian.PointMass(0); Assert.True(expected.MaxDiff(actual) < 1e-4); Gaussian max; max = new Gaussian(4, 5); actual = MaxGaussianOp.MaxAverageConditional(max, new Gaussian(0, 1), new Gaussian(2, 3)); actual *= max; expected = new Gaussian(2.720481395499785, 1.781481142817509); //expected = MaxPosterior(max, new Gaussian(0, 1), new Gaussian(2, 3)); Assert.True(expected.MaxDiff(actual) < 1e-4); max = new Gaussian(); max.MeanTimesPrecision = 0.2; max.Precision = 1e-10; actual = MaxGaussianOp.MaxAverageConditional(max, new Gaussian(0, 1), new Gaussian(0, 1)); actual *= max; expected = new Gaussian(0.702106815765215, 0.697676918460236); Assert.True(expected.MaxDiff(actual) < 1e-4); }
public void MaxTest2() { foreach (double max in new[] { 0.0, 2.0 }) { double oldm = double.NaN; double oldv = double.NaN; for (int i = 0; i < 300; i++) { Gaussian a = new Gaussian(System.Math.Pow(10, i), 177); Gaussian to_a = MaxGaussianOp.AAverageConditional(max, a, 0); Gaussian to_b = MaxGaussianOp.BAverageConditional(max, 0, a); Assert.Equal(to_a, to_b); if (max == 0) { Gaussian to_a2 = IsPositiveOp.XAverageConditional(false, a); double error = System.Math.Max(MMath.AbsDiff(to_a.MeanTimesPrecision, to_a2.MeanTimesPrecision, double.Epsilon), MMath.AbsDiff(to_a.Precision, to_a2.Precision, double.Epsilon)); //Trace.WriteLine($"{a} {to_a} {to_a2} {error}"); Assert.True(error < 1e-12); } //else Trace.WriteLine($"{a} {to_a}"); double m, v; to_a.GetMeanAndVariance(out m, out v); if (!double.IsNaN(oldm)) { Assert.True(v <= oldv); double olddiff = System.Math.Abs(max - oldm); double diff = System.Math.Abs(max - m); Assert.True(diff <= olddiff); } oldm = m; oldv = v; } } }
private void Max_APointMass(Gaussian max, Gaussian b) { double point = 3; Gaussian toPoint = MaxGaussianOp.AAverageConditional(max, Gaussian.PointMass(point), b); //Console.WriteLine($"{point} {toPoint} {toPoint.MeanTimesPrecision:g17} {toPoint.Precision:g17}"); if (max.IsPointMass && b.IsPointMass) { Gaussian toUniform = MaxGaussianOp.AAverageConditional(max, Gaussian.Uniform(), b); if (max.Point > b.Point) { Assert.Equal(toUniform, max); } else { Assert.Equal(toUniform, Gaussian.Uniform()); } } double oldDiff = double.PositiveInfinity; for (int i = 3; i < 100; i++) { Gaussian a = Gaussian.FromMeanAndPrecision(point, System.Math.Pow(10, i)); Gaussian to_a = MaxGaussianOp.AAverageConditional(max, a, b); double diff = toPoint.MaxDiff(to_a); //Console.WriteLine($"{a} {to_a} {to_a.MeanTimesPrecision:g17} {to_a.Precision:g17} {diff:g17}"); if (diff < 1e-14) { diff = 0; } Assert.True(diff <= oldDiff); oldDiff = diff; } }
// Test inference on a model where precision is scaled. internal void GammaProductTest() { for (int i = 0; i <= 20; i++) { double minutesPlayed = System.Math.Pow(0.1, i); if (i == 20) { minutesPlayed = 0; } var EventCountMean_F = Gaussian.PointMass(0); var EventCountPrecision_F = GammaRatioOp.RatioAverageConditional(Gamma.PointMass(1), minutesPlayed); var realCount_F = GaussianOp_PointPrecision.SampleAverageConditional(EventCountMean_F, EventCountPrecision_F); var realCount_use_B = MaxGaussianOp.BAverageConditional(0.0, 0.0, realCount_F); var EventCountPrecision_B = GaussianOp_PointPrecision.PrecisionAverageConditional(realCount_use_B, EventCountMean_F, EventCountPrecision_F); var EventsPerMinutePrecision_B = GammaRatioOp.AAverageConditional(EventCountPrecision_B, minutesPlayed); Console.WriteLine($"realCount_use_B = {realCount_use_B}, EventCountPrecision_B = {EventCountPrecision_B}, EventsPerMinutePrecision_B = {EventsPerMinutePrecision_B}"); } }
private void Max_MaxPointMass(Gaussian a, Gaussian b) { double point = 3; Gaussian toPoint = MaxGaussianOp.MaxAverageConditional(Gaussian.PointMass(point), a, b); //Console.WriteLine($"{point} {toPoint} {toPoint.MeanTimesPrecision} {toPoint.Precision}"); double oldDiff = double.PositiveInfinity; for (int i = 5; i < 100; i++) { Gaussian max = Gaussian.FromMeanAndPrecision(point, System.Math.Pow(10, i)); Gaussian to_max = MaxGaussianOp.MaxAverageConditional(max, a, b); double diff = toPoint.MaxDiff(to_max); //Console.WriteLine($"{max} {to_max} {to_max.MeanTimesPrecision} {to_max.Precision} {diff}"); if (diff < 1e-14) { diff = 0; } Assert.True(diff <= oldDiff); oldDiff = diff; } }