Exemple #1
0
        /// <summary>
        /// Construct a discrete HMM with the specified number of states.
        /// </summary>
        /// <param name="states">The number of states.</param>
        public HiddenMarkovModel(int states)
        {
            _items = null;
            pi     = new double[states];
            _transitionProbability = EngineArray.AllocateDouble2D(states, states);
            _stateDistributions    = new IStateDistribution[states];

            for (int i = 0; i < states; i++)
            {
                pi[i] = 1.0 / states;

                _stateDistributions[i] = new ContinousDistribution(
                    StateCount);

                for (int j = 0; j < states; j++)
                {
                    _transitionProbability[i][j] = 1.0 / states;
                }
            }
        }
        /// <inheritdoc/>
        public void Save(Stream os, Object obj)
        {
            EncogWriteHelper  writer = new EncogWriteHelper(os);
            HiddenMarkovModel net    = (HiddenMarkovModel)obj;

            writer.AddSection("HMM");
            writer.AddSubSection("PARAMS");
            writer.AddProperties(net.Properties);
            writer.AddSubSection("CONFIG");

            writer.WriteProperty(HiddenMarkovModel.TAG_STATES, net.StateCount);
            if (net.Items != null)
            {
                writer.WriteProperty(HiddenMarkovModel.TAG_ITEMS, net.Items);
            }
            writer.WriteProperty(HiddenMarkovModel.TAG_PI, net.Pi);
            writer.WriteProperty(HiddenMarkovModel.TAG_TRANSITION, new Matrix(net.TransitionProbability));

            for (int i = 0; i < net.StateCount; i++)
            {
                writer.AddSubSection("DISTRIBUTION-" + i);
                IStateDistribution sd = net.StateDistributions[i];
                writer.WriteProperty(HiddenMarkovModel.TAG_DIST_TYPE, sd.GetType().Name);

                if (sd is ContinousDistribution)
                {
                    ContinousDistribution cDist = (ContinousDistribution)sd;
                    writer.WriteProperty(HiddenMarkovModel.TAG_MEAN, cDist.Mean);
                    writer.WriteProperty(HiddenMarkovModel.TAG_COVARIANCE, cDist.Covariance);
                }
                else if (sd is DiscreteDistribution)
                {
                    DiscreteDistribution dDist = (DiscreteDistribution)sd;
                    writer.WriteProperty(HiddenMarkovModel.TAG_PROBABILITIES, new Matrix(dDist.Probabilities));
                }
            }

            writer.Flush();
        }
        /// <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);
        }