示例#1
0
        internal void SoftmaxGWAS()
        {
            var v  = Vector.Zero(1);
            var x1 = Variable.VectorGaussianFromMeanAndPrecision(Vector.Zero(1), PositiveDefiniteMatrix.Identity(1));

            x1.ObservedValue = v;
            var x2 = Variable.VectorGaussianFromMeanAndPrecision(Vector.Zero(1), PositiveDefiniteMatrix.Identity(1));

            v[0]             = 1;
            x2.ObservedValue = v;
            Console.WriteLine(x1.ObservedValue);
            Console.WriteLine(x2.ObservedValue);

            int numExposures = 10;
            int numClasses   = 5;
            int numSamples   = 1000;
            var c            = new Range(numClasses);
            var n            = new Range(numSamples);
            // model
            var Bexposures = Variable.Array <Vector>(c);

            Bexposures[c] = Variable.VectorGaussianFromMeanAndPrecision(
                Vector.Zero(numExposures),
                PositiveDefiniteMatrix.Identity(numExposures))
                            .ForEach(c);
            var exposures = Variable.Array <Vector>(n);
            var Bgenotype = Variable.Array <double>(c);

            Bgenotype[c] = Variable.GaussianFromMeanAndPrecision(0, 1).ForEach(c);
            var genotypes = Variable.Array <double>(n);
            var mean      = Variable.Array <double>(c);

            mean[c] = Variable.GaussianFromMeanAndPrecision(0, 1).ForEach(c);
            var g = Variable.Array(Variable.Array <double>(c), n);

            g[n][c] = Bgenotype[c] * genotypes[n] + Variable.InnerProduct(Bexposures[c], exposures[n]) + mean[c];
            var classProbs = Variable.Array <Vector>(n);

            classProbs[n] = Variable.Softmax(g[n]);
            var classAssignments = Variable.Array <int>(n);

            classAssignments[n] = Variable.Discrete(classProbs[n]);
            // generate data
            var exposuresObs   = new Vector[numSamples];
            var genotypeObs    = new double[numSamples];
            var classObs       = new int[numSamples];
            var trueBexposures = new Vector[numClasses];
            var trueBgenotype  = new double[numClasses];

            Rand.Restart(123);
            for (int i = 0; i < numClasses; i++)
            {
                trueBexposures[i] = VectorGaussian.SampleFromMeanAndVariance(Vector.Zero(numExposures), PositiveDefiniteMatrix.Identity(numExposures));
                trueBgenotype[i]  = Rand.Normal();
            }
            for (int i = 0; i < numSamples; i++)
            {
                exposuresObs[i] = VectorGaussian.SampleFromMeanAndVariance(Vector.Zero(numExposures), PositiveDefiniteMatrix.Identity(numExposures));
                genotypeObs[i]  = Rand.Double() < .5 ? 0.0 : 1.0;
                var gt = new double[numClasses];
                for (int j = 0; j < numClasses; j++)
                {
                    gt[j] = genotypeObs[i] * trueBgenotype[j] + exposuresObs[i].Inner(trueBexposures[j]);
                }
                var p = MMath.Softmax(gt);
                classObs[i] = Discrete.Sample(p);
            }
            Rand.Restart(DateTime.Now.Millisecond);
            exposures.ObservedValue        = exposuresObs;
            genotypes.ObservedValue        = genotypeObs;
            classAssignments.ObservedValue = classObs;
            // inference
            var ie    = new InferenceEngine(new VariationalMessagePassing());
            var bPost = ie.Infer <Gaussian[]>(Bgenotype);

            for (int i = 0; i < numClasses; i++)
            {
                Console.WriteLine("Inferred: " + bPost[i] + " truth: " + trueBgenotype[i]);
            }
        }