/// <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"); }
/// <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"); }