Esempio n. 1
0
        public static BayesianNetwork ToBayesianNetwork(this JObject json)
        {
            string networkName = json["name"].Value <string>();

            var bn = new BayesianNetwork(networkName);

            // Load variables and note parents.
            var variableList = new List <string>();
            var parentsList  = new Dictionary <string, string[]>();

            foreach (var jrv in json.Property("variables").Value)
            {
                var rv = ToRandomVariable(jrv);
                bn.AddVariable(rv);

                variableList.Add(rv.Name);
                parentsList.Add(rv.Name, jrv["parents"].Values <string>().ToArray());
            }

            // Reparent.
            foreach (var rv in variableList)
            {
                string[] parents = parentsList[rv];
                foreach (var parentName in parents)
                {
                    bn.ConnectVariables(parentName, rv);
                }
            }

            return(bn);
        }
        public static BayesianNetwork ToBayesianNetwork(this JObject json)
        {
            string networkName = json["name"].Value<string>();

            var bn = new BayesianNetwork(networkName);

            // Load variables and note parents.
            var variableList = new List<string>();
            var parentsList = new Dictionary<string, string[]>();
            foreach (var jrv in json.Property("variables").Value)
            {
                var rv = ToRandomVariable(jrv);
                bn.AddVariable(rv);

                variableList.Add(rv.Name);
                parentsList.Add(rv.Name, jrv["parents"].Values<string>().ToArray());
            }

            // Reparent.
            foreach (var rv in variableList)
            {
                string[] parents = parentsList[rv];
                foreach (var parentName in parents)
                {
                    bn.ConnectVariables(parentName, rv);
                }
            }

            return bn;
        }
Esempio n. 3
0
        protected void DoLearning(LearningTask learningTask)
        {
            if (learningTask.LearningState == ComputationState.Done)
            {
                return;
            }

            // Grab options.
            var options = learningTask.Options;

            // Grab training set.
            var trainingSet = learningTask.TrainingSet;

            // Grab variable names.
            var firstObservation = learningTask.TrainingSet.First();
            var variableNames = firstObservation.VariableNames;

            // Build a starter Bayesian network.
            var bn = new BayesianNetwork(learningTask.TrainingSet.Name);

            // Build variables for each variable in the training set.
            foreach (var variableName in variableNames)
            {
                var space = trainingSet.Variables.TryFind(variableName).Value;
                var rv = new RandomVariable(variableName, space);
                bn.AddVariable(rv);
            }

            // Store in task so that task can send updates to its listeners.
            learningTask.BayesianNetwork = bn;
            learningTask.LearningState = ComputationState.Computing;

            // Build Dirichlet parameters
            IDictionary<string, DirichletDistribution> priors = new Dictionary<string, DirichletDistribution>();
            foreach (var variableName in variableNames)
            {
                var space = trainingSet.Variables.TryFind(variableName).Value;

                DirichletDistribution prior;
                if (options.DistributionDirichletAlpha > 0)
                {
                    prior = new DirichletDistribution();
                    foreach (var value in space.Values)
                    {
                        prior.SetParameter(value, options.DistributionDirichletAlpha);
                    }
                    priors[variableName] = prior;
                }
            }

            // Initialize a sufficient statistics.
            SufficientStatistics sufficientStatistics
                = new SufficientStatistics(trainingSet, Utils.Some(priors));

            // Learn structure.
            switch (options.Structure)
            {
                case LearningOptions.StructureEnum.DisconnectedStructure:
                    break;
                case LearningOptions.StructureEnum.RandomStructure:
                    bn.GenerateStructure(
                        StructureClass.Random,
                        Utils.Some(options.StructureSeed),
                        Utils.Some(options.StructureParentLimit));
                    break;
                case LearningOptions.StructureEnum.TreeStructure:
                    bn.LearnStructure(
                        sufficientStatistics,
                        StructureClass.Tree,
                        Utils.None<int>(),
                        Utils.None<int>());
                    break;
                case LearningOptions.StructureEnum.GeneralStructure:
                    bn.LearnStructure(
                        sufficientStatistics,
                        StructureClass.General,
                        Utils.None<int>(),
                        Utils.Some(options.StructureParentLimit));
                    break;
            }

            // Learn distributions.
            bn.LearnDistributions(sufficientStatistics);

            // Done.
            learningTask.LearningState = ComputationState.Done;
        }
Esempio n. 4
0
        protected void DoLearning(LearningTask learningTask)
        {
            if (learningTask.LearningState == ComputationState.Done)
            {
                return;
            }

            // Grab options.
            var options = learningTask.Options;

            // Grab training set.
            var trainingSet = learningTask.TrainingSet;

            // Grab variable names.
            var firstObservation = learningTask.TrainingSet.First();
            var variableNames    = firstObservation.VariableNames;

            // Build a starter Bayesian network.
            var bn = new BayesianNetwork(learningTask.TrainingSet.Name);

            // Build variables for each variable in the training set.
            foreach (var variableName in variableNames)
            {
                var space = trainingSet.Variables.TryFind(variableName).Value;
                var rv    = new RandomVariable(variableName, space);
                bn.AddVariable(rv);
            }

            // Store in task so that task can send updates to its listeners.
            learningTask.BayesianNetwork = bn;
            learningTask.LearningState   = ComputationState.Computing;

            // Build Dirichlet parameters
            IDictionary <string, DirichletDistribution> priors = new Dictionary <string, DirichletDistribution>();

            foreach (var variableName in variableNames)
            {
                var space = trainingSet.Variables.TryFind(variableName).Value;

                DirichletDistribution prior;
                if (options.DistributionDirichletAlpha > 0)
                {
                    prior = new DirichletDistribution();
                    foreach (var value in space.Values)
                    {
                        prior.SetParameter(value, options.DistributionDirichletAlpha);
                    }
                    priors[variableName] = prior;
                }
            }

            // Initialize a sufficient statistics.
            SufficientStatistics sufficientStatistics
                = new SufficientStatistics(trainingSet, Utils.Some(priors));

            // Learn structure.
            switch (options.Structure)
            {
            case LearningOptions.StructureEnum.DisconnectedStructure:
                break;

            case LearningOptions.StructureEnum.RandomStructure:
                bn.GenerateStructure(
                    StructureClass.Random,
                    Utils.Some(options.StructureSeed),
                    Utils.Some(options.StructureParentLimit));
                break;

            case LearningOptions.StructureEnum.TreeStructure:
                bn.LearnStructure(
                    sufficientStatistics,
                    StructureClass.Tree,
                    Utils.None <int>(),
                    Utils.None <int>());
                break;

            case LearningOptions.StructureEnum.GeneralStructure:
                bn.LearnStructure(
                    sufficientStatistics,
                    StructureClass.General,
                    Utils.None <int>(),
                    Utils.Some(options.StructureParentLimit));
                break;
            }

            // Learn distributions.
            bn.LearnDistributions(sufficientStatistics);

            // Done.
            learningTask.LearningState = ComputationState.Done;
        }