public HiddenMarkovModel CloneStructure()
        {
            HiddenMarkovModel hmm;

            if (IsDiscrete)
            {
                hmm = new HiddenMarkovModel(StateCount, _items);
            }
            else
            {
                hmm = new HiddenMarkovModel(StateCount);
            }

            return hmm;
        }
 object ICloneable.Clone()
 {
     var result = new HiddenMarkovModel(StateCount);
     EngineArray.ArrayCopy(Pi, result.Pi);
     EngineArray.ArrayCopy(TransitionProbability, result.TransitionProbability);
     for (int i = 0; i < StateCount;i++)
     {
         result.StateDistributions[i] = StateDistributions[i].Clone();
     }
     return result;
 }
        static HiddenMarkovModel BuildDiscHMM()
        {
            HiddenMarkovModel hmm =
                new HiddenMarkovModel(2, 2);

            hmm.Pi[0] = 0.95;
            hmm.Pi[1] = 0.05;

            hmm.StateDistributions[0] = new DiscreteDistribution(new double[][] { new[] { 0.95, 0.05 } });
            hmm.StateDistributions[1] = new DiscreteDistribution(new double[][] { new[] { 0.20, 0.80 } });

            hmm.TransitionProbability[0][1] = 0.05;
            hmm.TransitionProbability[0][0] = 0.95;
            hmm.TransitionProbability[1][0] = 0.10;
            hmm.TransitionProbability[1][1] = 0.90;

            return hmm;
        }
        public void Validate(HiddenMarkovModel result, HiddenMarkovModel source)
        {
            KullbackLeiblerDistanceCalculator klc =
                    new KullbackLeiblerDistanceCalculator();

            double e = klc.Distance(result, source);
            Assert.IsTrue(e < 0.01);
        }
        static HiddenMarkovModel BuildContHMM()
        {
            double [] mean1 = {0.25, -0.25};
            double [][] covariance1 = { new[] {1.0, 2.0}, new[] {1.0, 4.0} };

            double [] mean2 = {0.5, 0.25};
            double [][] covariance2 = { new[] {4.0, 2.0}, new[] {3.0, 4.0} };

            HiddenMarkovModel hmm = new HiddenMarkovModel(2);

            hmm.Pi[0] = 0.8;
            hmm.Pi[1] = 0.2;

            hmm.StateDistributions[0] = new ContinousDistribution(mean1,covariance1);
            hmm.StateDistributions[1] = new ContinousDistribution(mean2,covariance2);

            hmm.TransitionProbability[0][1] = 0.05;
            hmm.TransitionProbability[0][0] = 0.95;
            hmm.TransitionProbability[1][0] = 0.10;
            hmm.TransitionProbability[1][1] = 0.90;

            return hmm;
        }
Example #6
0
        /* Initial guess for the Baum-Welch algorithm */
        private static HiddenMarkovModel BuildDiscInitHMM()
        {
            var hmm = new HiddenMarkovModel(2, 2);

            hmm.Pi[0] = 0.50;
            hmm.Pi[1] = 0.50;

            hmm.StateDistributions[0] = new DiscreteDistribution(new[] {new[] {0.8, 0.2}});
            hmm.StateDistributions[1] = new DiscreteDistribution(new[] {new[] {0.1, 0.9}});

            hmm.TransitionProbability[0][1] = 0.2;
            hmm.TransitionProbability[0][0] = 0.8;
            hmm.TransitionProbability[1][0] = 0.2;
            hmm.TransitionProbability[1][1] = 0.8;

            return hmm;
        }
Example #7
0
        private static HiddenMarkovModel BuildContInitHMM()
        {
            double[] mean1 = {0.20, -0.20};
            double[][] covariance1 = {new[] {1.3, 2.2}, new[] {1.3, 4.3}};

            double[] mean2 = {0.5, 0.25};
            double[][] covariance2 = {new[] {4.1, 2.1}, new[] {3.2, 4.4}};

            var hmm = new HiddenMarkovModel(2);

            hmm.Pi[0] = 0.9;
            hmm.Pi[1] = 0.1;

            hmm.StateDistributions[0] = new ContinousDistribution(mean1, covariance1);
            hmm.StateDistributions[1] = new ContinousDistribution(mean2, covariance2);

            hmm.TransitionProbability[0][1] = 0.10;
            hmm.TransitionProbability[0][0] = 0.90;
            hmm.TransitionProbability[1][0] = 0.15;
            hmm.TransitionProbability[1][1] = 0.85;

            return hmm;
        }
Example #8
0
        /// <inheritdoc/>
        public Object Read(Stream istream)
        {
            int states = 0;
            int[] items;
            double[] pi = null;
            Matrix transitionProbability = null;
            IDictionary<String, String> properties = null;
            IList<IStateDistribution> distributions = new List<IStateDistribution>();

            EncogReadHelper reader = new EncogReadHelper(istream);
            EncogFileSection section;

            while ((section = reader.ReadNextSection()) != null)
            {
                if (section.SectionName.Equals("HMM")
                        && section.SubSectionName.Equals("PARAMS"))
                {
                    properties = section.ParseParams();

                }
                if (section.SectionName.Equals("HMM")
                        && section.SubSectionName.Equals("CONFIG"))
                {
                    IDictionary<String, String> p = section.ParseParams();

                    states = EncogFileSection.ParseInt(p, HiddenMarkovModel.TAG_STATES);

                    if (p.ContainsKey(HiddenMarkovModel.TAG_ITEMS))
                    {
                        items = EncogFileSection.ParseIntArray(p, HiddenMarkovModel.TAG_ITEMS);
                    }
                    pi = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_PI);
                    transitionProbability = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_TRANSITION);
                }
                else if (section.SectionName.Equals("HMM")
                      && section.SubSectionName.StartsWith("DISTRIBUTION-"))
                {
                    IDictionary<String, String> p = section.ParseParams();
                    String t = p[HiddenMarkovModel.TAG_DIST_TYPE];
                    if ("ContinousDistribution".Equals(t))
                    {
                        double[] mean = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_MEAN);
                        Matrix cova = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_COVARIANCE);
                        ContinousDistribution dist = new ContinousDistribution(mean, cova.Data);
                        distributions.Add(dist);
                    }
                    else if ("DiscreteDistribution".Equals(t))
                    {
                        Matrix prob = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_PROBABILITIES);
                        DiscreteDistribution dist = new DiscreteDistribution(prob.Data);
                        distributions.Add(dist);
                    }
                }
            }

            HiddenMarkovModel result = new HiddenMarkovModel(states);
            EngineArray.PutAll(properties, result.Properties);
            result.TransitionProbability = transitionProbability.Data;
            result.Pi = pi;
            int index = 0;
            foreach (IStateDistribution dist in distributions)
            {
                result.StateDistributions[index++] = dist;
            }

            return result;
        }
Example #9
0
        /// <inheritdoc/>
        public Object Read(Stream istream)
        {
            int states = 0;

            int[]    items;
            double[] pi = null;
            Matrix   transitionProbability             = null;
            IDictionary <String, String> properties    = null;
            IList <IStateDistribution>   distributions = new List <IStateDistribution>();

            EncogReadHelper  reader = new EncogReadHelper(istream);
            EncogFileSection section;

            while ((section = reader.ReadNextSection()) != null)
            {
                if (section.SectionName.Equals("HMM") &&
                    section.SubSectionName.Equals("PARAMS"))
                {
                    properties = section.ParseParams();
                }
                if (section.SectionName.Equals("HMM") &&
                    section.SubSectionName.Equals("CONFIG"))
                {
                    IDictionary <String, String> p = section.ParseParams();

                    states = EncogFileSection.ParseInt(p, HiddenMarkovModel.TAG_STATES);

                    if (p.ContainsKey(HiddenMarkovModel.TAG_ITEMS))
                    {
                        items = EncogFileSection.ParseIntArray(p, HiddenMarkovModel.TAG_ITEMS);
                    }
                    pi = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_PI);
                    transitionProbability = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_TRANSITION);
                }
                else if (section.SectionName.Equals("HMM") &&
                         section.SubSectionName.StartsWith("DISTRIBUTION-"))
                {
                    IDictionary <String, String> p = section.ParseParams();
                    String t = p[HiddenMarkovModel.TAG_DIST_TYPE];
                    if ("ContinousDistribution".Equals(t))
                    {
                        double[] mean = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_MEAN);
                        Matrix   cova = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_COVARIANCE);
                        ContinousDistribution dist = new ContinousDistribution(mean, cova.Data);
                        distributions.Add(dist);
                    }
                    else if ("DiscreteDistribution".Equals(t))
                    {
                        Matrix prob = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_PROBABILITIES);
                        DiscreteDistribution dist = new DiscreteDistribution(prob.Data);
                        distributions.Add(dist);
                    }
                }
            }

            HiddenMarkovModel result = new HiddenMarkovModel(states);

            EngineArray.PutAll(properties, result.Properties);
            result.TransitionProbability = transitionProbability.Data;
            result.Pi = pi;
            int index = 0;

            foreach (IStateDistribution dist in distributions)
            {
                result.StateDistributions[index++] = dist;
            }


            return(result);
        }