public double Sample() { if (IsPointMass) { return(Point); } else if (!IsProper()) { throw new ImproperDistributionException(this); } else { return(Rand.Beta(TrueCount, FalseCount)); } }
public static double Sample(double trueCount, double falseCount) { return(Rand.Beta(trueCount, falseCount)); }
public static double BetaFromMeanAndTotalCount(double mean, double totalCount) { return(Rand.Beta(mean * totalCount, (1 - mean) * totalCount)); }
public static double Sample(double trueCount, double falseCount, IPolyrand random = null) { return(Rand.Beta(trueCount, falseCount, random)); }
internal void BetaRegression() { int P = 8; double[] b = new double[P]; for (int p = 0; p < P; p++) { b[p] = Rand.Beta(1, 1); } int N = 100; double[][] X = new double[N][]; //Gaussian[][] softX = new Gaussian[N][]; double[] Y = new double[N]; for (int n = 0; n < N; n++) { X[n] = new double[P]; //softX[n] = new Gaussian[P]; Y[n] = 0; for (int p = 0; p < P; p++) { X[n][p] = Rand.Normal(); //softX[n][p] = new Gaussian(X[n][p], 1e-4); Y[n] += X[n][p] * b[p]; } } Variable <bool> evidence = Variable.Bernoulli(0.5).Named("evidence"); IfBlock block = Variable.If(evidence); Range dim = new Range(P).Named("P"); Range item = new Range(N).Named("N"); VariableArray <double> w = Variable.Array <double>(dim).Named("w"); w[dim] = Variable.Beta(1, 1).ForEach(dim); var x = Variable.Array(Variable.Array <double>(dim), item).Named("x"); var softXvar = Variable.Array(Variable.Array <double>(dim), item).Named("softx"); softXvar.ObservedValue = X; x[item][dim] = Variable.GaussianFromMeanAndPrecision(softXvar[item][dim], 1e4); var wx = Variable.Array(Variable.Array <double>(dim), item).Named("wx"); wx[item][dim] = x[item][dim] * w[dim]; var sum = Variable.Array <double>(item).Named("sum"); sum[item] = Variable.Sum(wx[item]); var prec = Variable.GammaFromShapeAndRate(.1, .1).Named("Noise"); var y = Variable.Array <double>(item).Named("y"); y[item] = Variable.GaussianFromMeanAndPrecision(sum[item], prec); block.CloseBlock(); y.ObservedValue = Y; InferenceEngine engine = new InferenceEngine(new VariationalMessagePassing()); var ca = engine.GetCompiledInferenceAlgorithm(evidence, w); ca.Reset(); double oldLogEvidence = double.NegativeInfinity; for (int i = 0; i < 1000; i++) { ca.Update(1); double logEvidence1 = ca.Marginal <Bernoulli>(evidence.NameInGeneratedCode).LogOdds; Console.WriteLine(logEvidence1); if (i > 20 && System.Math.Abs(logEvidence1 - oldLogEvidence) < 0.01) { break; } oldLogEvidence = logEvidence1; } DistributionArray <Beta> wInferred = ca.Marginal <DistributionArray <Beta> >(w.NameInGeneratedCode); for (int p = 0; p < P; p++) { Console.WriteLine("w[{0}] = {1} +/- {2} should be {3}", p, wInferred[p].GetMean(), System.Math.Sqrt(wInferred[p].GetVariance()), b[p]); } }