Пример #1
0
        /// <summary>
        /// Results for loopy belief propagation section
        /// </summary>
        public void LoopyExample()
        {
            string     section         = Contents.S3Loopiness.NumberedName;
            Inputs     inputs          = LoadInputData("Toy4");
            Experiment loopyExperiment = new Experiment
            {
                // version without plates
                Inputs = inputs,
                Model  = new UnrolledModel
                {
                    Name = "Loopy",
                    ProbabilityOfGuess      = 0.2,
                    ProbabilityOfNotMistake = 0.9,
                    ProbabilityOfSkillTrue  = 0.5,
                    ShowFactorGraph         = false
                }
            };

            AnnounceAndRun(loopyExperiment, section);
            Experiment exactLoopyExperiment = new Experiment
            {
                // exact results
                Inputs = inputs,
                Model  = new UnrolledModel
                {
                    Name = "LoopyExact",
                    ProbabilityOfGuess      = 0.2,
                    ProbabilityOfNotMistake = 0.9,
                    ProbabilityOfSkillTrue  = 0.5,
                    ShowFactorGraph         = false,
                    ExactInference          = true
                }
            };

            AnnounceAndRun(exactLoopyExperiment, section);
            ExperimentComparison comparison = new ExperimentComparison(
                new[]
            {
                loopyExperiment,
                exactLoopyExperiment
            });

            //learningSkills.Run();

            var histories = ((UnrolledModel)loopyExperiment.Model).MessageHistories;

            // Show message progress for edges A, B, C, D
            var messageHistories = new Dictionary <string, object>
            {
                { "Iteration", new[] { 1, 2, 3, 4, 5 } },
                { "A", histories["sql_uses_B[1]"].ToArray() },
                { "B", histories["sql_uses_F[2]"].ToArray() },
                { "C", histories["csharp_uses_B[2]"].ToArray() },
                { "D", histories["csharp_uses_F[1]"].ToArray() }
            };

            outputter.Out(messageHistories, section, "Loop Messages");
            outputter.Out(comparison, section, "Comparison");
        }
Пример #2
0
        /// <summary>
        /// Real data inference. Try with guess probability fixed and inferred
        /// </summary>
        /// <param name="inputs">The inputs.</param>
        /// <param name="name">The name.</param>
        public void RealDataInference()
        {
            // Define priors (fixed and learnt)
            const double ProbGuess      = 0.2;
            const double ProbNotMistake = 0.9;
            const double ProbSkillTrue  = 0.5;

            Inputs inputs = LoadInputData("InputData");

            Console.WriteLine($"\n{Contents.S4MovingToRealData.NumberedName}\n");
            outputter.Out(inputs, Contents.S4MovingToRealData.NumberedName, "Inputs");
            // Original model (point mass priors)
            Experiment originalExperiment = new Experiment
            {
                Inputs = inputs,
                Model  = new NoisyAndModel
                {
                    Name = "Original",
                    ProbabilityOfGuess      = ProbGuess,
                    ProbabilityOfNotMistake = ProbNotMistake,
                    ProbabilityOfSkillTrue  = ProbSkillTrue,
                    ShowFactorGraph         = false,
                    IsReal = true
                }
            };

            AnnounceAndRun(originalExperiment, Contents.S4MovingToRealData.NumberedName);

            Console.WriteLine($"\n{Contents.S5DiagnosingTheProblem.NumberedName}\n");

            // Sampled model using ground truth skills
            Experiment samleSkillsObservedExperiment = new Experiment
            {
                Inputs = originalExperiment.Model.SampleFromModel(
                    inputs, inputs.NumberOfPeople, new object[] { ProbSkillTrue, true }),
                Model = new NoisyAndModel
                {
                    Name = "SampleSkillsObserved",
                    ProbabilityOfGuess      = ProbGuess,
                    ProbabilityOfNotMistake = ProbNotMistake,
                    ProbabilityOfSkillTrue  = ProbSkillTrue,
                    IsReal = false
                }
            };

            AnnounceAndRun(samleSkillsObservedExperiment, Contents.S5DiagnosingTheProblem.NumberedName);

            // Sampled model using sampled skills
            Experiment sampleSkillsSampledExperiment = new Experiment
            {
                Inputs = originalExperiment.Model.SampleFromModel(
                    inputs, inputs.NumberOfPeople, new object[] { ProbSkillTrue, false }),
                Model = new NoisyAndModel
                {
                    Name = "SampleSkillsSampled",
                    ProbabilityOfGuess      = ProbGuess,
                    ProbabilityOfNotMistake = ProbNotMistake,
                    ProbabilityOfSkillTrue  = ProbSkillTrue,
                    IsReal = false
                }
            };

            AnnounceAndRun(sampleSkillsSampledExperiment, Contents.S5DiagnosingTheProblem.NumberedName);

            Console.WriteLine($"\n{Contents.S6LearningTheGuessProbabilities.NumberedName}\n");
            outputter.Out(inputs, Contents.S6LearningTheGuessProbabilities.NumberedName, "Inputs");

            Beta guessPrior = BetaFromMeanAndTotalCount(0.25, 10);

            outputter.Out(
                guessPrior,
                Contents.S6LearningTheGuessProbabilities.NumberedName,
                "Priors");

            // Random model
            Experiment randomExperiment = new Experiment
            {
                Inputs = inputs,
                Model  = new RandomModel
                {
                    Name = "Random",
                    ProbabilityOfGuess      = 0.5,
                    ProbabilityOfNotMistake = 0.5,
                    ProbabilityOfSkillTrue  = 0.5,
                    Index           = 8,
                    ShowFactorGraph = false,
                    IsReal          = false
                }
            };

            AnnounceAndRun(randomExperiment, Contents.S6LearningTheGuessProbabilities.NumberedName);

            // Model with Beta prior over guess probabilities
            Experiment learnedExperiment = new Experiment
            {
                Inputs = inputs,
                Model  = new LearnedNoisyAndModel
                {
                    Name = "Learned",
                    ProbabilityOfGuess      = ProbGuess,
                    ProbabilityOfNotMistake = ProbNotMistake,
                    ProbabilityOfSkillTrue  = ProbSkillTrue,
                    GuessPrior      = guessPrior,
                    ShowFactorGraph = false,
                    IsReal          = true
                }
            };

            AnnounceAndRun(learnedExperiment, Contents.S6LearningTheGuessProbabilities.NumberedName);

            Experiment perfectExperiment = new Experiment
            {
                FullyObserved = true,
                Inputs        = inputs,
                Model         = new NoisyAndModel {
                    Name = "Perfect", Index = 9, IsReal = false
                }
            };

            AnnounceAndRun(perfectExperiment, Contents.S6LearningTheGuessProbabilities.NumberedName);

            ExperimentComparison comparison = new ExperimentComparison();

            comparison.Experiments.Add(randomExperiment);
            comparison.Experiments.Add(originalExperiment);
            comparison.Experiments.Add(samleSkillsObservedExperiment);
            comparison.Experiments.Add(sampleSkillsSampledExperiment);
            comparison.Experiments.Add(learnedExperiment);
            comparison.Experiments.Add(perfectExperiment);

            //Selected guess posteriors
            outputter.Out(
                learnedExperiment.Results.GuessPosteriors
                .Select((ia, i) => new { ia, i })
                .Where((ia, i) => i % 5 == 0)
                .ToDictionary <dynamic, string, Beta>(x => "Question " + (x.i + 1), x => x.ia),
                Contents.S6LearningTheGuessProbabilities.NumberedName,
                "SelectedGuessPosteriors");

            outputter.Out(comparison, Contents.S6LearningTheGuessProbabilities.NumberedName, "Comparison");
        }