Ejemplo n.º 1
0
 public double Sample()
 {
     if (IsPointMass)
     {
         return(Point);
     }
     else if (!IsProper())
     {
         throw new ImproperDistributionException(this);
     }
     else
     {
         return(Rand.Beta(TrueCount, FalseCount));
     }
 }
Ejemplo n.º 2
0
 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));
 }
Ejemplo n.º 4
0
Archivo: Beta.cs Proyecto: 0xCM/arrows
 public static double Sample(double trueCount, double falseCount, IPolyrand random = null)
 {
     return(Rand.Beta(trueCount, falseCount, random));
 }
Ejemplo n.º 5
0
        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]);
            }
        }