Inheritance: HiddenMarkovModelBase, IHiddenMarkovModel
Example #1
0
        /// <summary>
        ///   Computes Forward probabilities for a given hidden Markov model and a set of observations.
        /// </summary>
        public static double[,] Forward(ContinuousHiddenMarkovModel model, double[][] observations, out double[] scaling)
        {
            int states = model.States;

            double[,] A = model.Transitions;
            IDistribution[] B  = model.Emissions;
            double[]        pi = model.Probabilities;

            int T   = observations.Length;
            var fwd = new double[T, states];

            scaling = new double[T];


            // 1. Initialization
            for (int i = 0; i < states; i++)
            {
                scaling[0] += fwd[0, i] = pi[i] * B[i].ProbabilityFunction(observations[0]);
            }

            if (scaling[0] != 0) // Scaling
            {
                for (int i = 0; i < states; i++)
                {
                    fwd[0, i] /= scaling[0];
                }
            }


            // 2. Induction
            for (int t = 1; t < T; t++)
            {
                double[] obs = observations[t];

                for (int i = 0; i < states; i++)
                {
                    double sum = 0.0;
                    for (int j = 0; j < states; j++)
                    {
                        sum += fwd[t - 1, j] * A[j, i];
                    }
                    fwd[t, i] = sum * B[i].ProbabilityFunction(obs);

                    scaling[t] += fwd[t, i]; // scaling coefficient
                }

                if (scaling[t] != 0) // Scaling
                {
                    for (int i = 0; i < states; i++)
                    {
                        fwd[t, i] /= scaling[t];
                    }
                }
            }

            return(fwd);
        }
        public void TestErrorRateDecreasesAfterEachIteration()
        {
            var hmm = new ContinuousHiddenMarkovModel(States, Symbols);
            var testSequence = new double[] {YesUmbrella, YesUmbrella, NoUmbrella};
            var initialError = 1 - hmm.Evaluate(testSequence);

            var trainedHmm = TrainHelper(new[] {testSequence});
            var errorAfterTraining = 1 - trainedHmm.Evaluate(testSequence);
            Assert.IsTrue(errorAfterTraining <= initialError);
        }
Example #3
0
 public static void AssertHMMAreEqual(ContinuousHiddenMarkovModel expected, 
     ContinuousHiddenMarkovModel actual)
 {
     // ensure all parameters are still the same
     //  including Dimension, number of states,
     //  starting-state probabilities and transition matrix.
     Assert.AreEqual(expected.Dimension, actual.Dimension);
     Assert.AreEqual(expected.States, actual.States);
     AssertVectorsAreEqual(expected.Probabilities, actual.Probabilities);
     AssertMatricesAreEqual(expected.Transitions, actual.Transitions, expected.States);
 }
Example #4
0
        /// <summary>
        ///   Computes Forward probabilities for a given hidden Markov model and a set of observations.
        /// </summary>
        public static double[,] Forward(ContinuousHiddenMarkovModel model, double[][] observations,
                                        out double logLikelihood)
        {
            double[] coefficients;
            double[,] fwd = Forward(model, observations, out coefficients);

            logLikelihood = 0;
            for (int i = 0; i < coefficients.Length; i++)
            {
                logLikelihood += System.Math.Log(coefficients[i]);
            }

            return(fwd);
        }
        private static ContinuousHiddenMarkovModel TrainHelper(double[][] sequences)
        {
            var hmm = new ContinuousHiddenMarkovModel(States, Symbols);
            var learner = new ContinuousBaumWelchLearning(hmm)
            {
                Tolerance = MinTolerance,
                Iterations = MaxIterations,
                FittingOptions = new NormalOptions()
                {
                    Regularization = RegularisationFactor
                }
            };

            learner.Run(sequences);
            return hmm;
        }
Example #6
0
        public void TestDeserialisationUndoesSerialisation()
        {
            const int states = 3;
            var origHMM = new ContinuousHiddenMarkovModel(states, new NormalDistribution(4));

            // change the model slightly.
            // i.e. make state 1 twice as likely, make state 0 not a starting state.
            origHMM.Probabilities[1] += origHMM.Probabilities[0];
            origHMM.Probabilities[0] = 0;

            // save then load the model
            string path = Path.GetTempFileName();
            (new HMM(origHMM)).SaveToFile(path);

            var newHMM = HMM.CreateFromFile(path).CHMM;
            File.Delete(path);
            AssertHMMAreEqual(origHMM, newHMM);
        }
Example #7
0
        /// <summary>
        ///   Computes Backward probabilities for a given hidden Markov model and a set of observations.
        /// </summary>
        public static double[,] Backward(ContinuousHiddenMarkovModel model, double[][] observations, double[] scaling)
        {
            int states = model.States;

            double[,] A = model.Transitions;
            IDistribution[] B  = model.Emissions;
            double[]        pi = model.Probabilities;

            int T   = observations.Length;
            var bwd = new double[T, states];

            // For backward variables, we use the same scale factors
            //   for each time t as were used for forward variables.

            // 1. Initialization
            for (int i = 0; i < states; i++)
            {
                bwd[T - 1, i] = 1.0 / scaling[T - 1];
            }

            // 2. Induction
            for (int t = T - 2; t >= 0; t--)
            {
                for (int i = 0; i < states; i++)
                {
                    double sum = 0;
                    for (int j = 0; j < states; j++)
                    {
                        sum += A[i, j] * B[j].ProbabilityFunction(observations[t + 1]) * bwd[t + 1, j];
                    }
                    bwd[t, i] += sum / scaling[t];
                }
            }

            return(bwd);
        }
        /// <summary>
        ///   Computes Forward probabilities for a given hidden Markov model and a set of observations.
        /// </summary>
        public static double[,] Forward(ContinuousHiddenMarkovModel model, double[][] observations, out double[] scaling)
        {
            int states = model.States;
            double[,] A = model.Transitions;
            IDistribution[] B = model.Emissions;
            double[] pi = model.Probabilities;

            int T = observations.Length;
            var fwd = new double[T,states];
            scaling = new double[T];


            // 1. Initialization
            for (int i = 0; i < states; i++)
                scaling[0] += fwd[0, i] = pi[i]*B[i].ProbabilityFunction(observations[0]);

            if (scaling[0] != 0) // Scaling
            {
                for (int i = 0; i < states; i++)
                    fwd[0, i] /= scaling[0];
            }


            // 2. Induction
            for (int t = 1; t < T; t++)
            {
                double[] obs = observations[t];

                for (int i = 0; i < states; i++)
                {
                    double sum = 0.0;
                    for (int j = 0; j < states; j++)
                        sum += fwd[t - 1, j]*A[j, i];
                    fwd[t, i] = sum*B[i].ProbabilityFunction(obs);

                    scaling[t] += fwd[t, i]; // scaling coefficient
                }

                if (scaling[t] != 0) // Scaling
                {
                    for (int i = 0; i < states; i++)
                        fwd[t, i] /= scaling[t];
                }
            }

            return fwd;
        }
        /// <summary>
        ///   Computes Backward probabilities for a given hidden Markov model and a set of observations.
        /// </summary>
        public static double[,] Backward(ContinuousHiddenMarkovModel model, double[][] observations, double[] scaling)
        {
            int states = model.States;
            double[,] A = model.Transitions;
            IDistribution[] B = model.Emissions;
            double[] pi = model.Probabilities;

            int T = observations.Length;
            var bwd = new double[T,states];

            // For backward variables, we use the same scale factors
            //   for each time t as were used for forward variables.

            // 1. Initialization
            for (int i = 0; i < states; i++)
                bwd[T - 1, i] = 1.0/scaling[T - 1];

            // 2. Induction
            for (int t = T - 2; t >= 0; t--)
            {
                for (int i = 0; i < states; i++)
                {
                    double sum = 0;
                    for (int j = 0; j < states; j++)
                        sum += A[i, j]*B[j].ProbabilityFunction(observations[t + 1])*bwd[t + 1, j];
                    bwd[t, i] += sum/scaling[t];
                }
            }

            return bwd;
        }
        /// <summary>
        ///   Computes Forward probabilities for a given hidden Markov model and a set of observations.
        /// </summary>
        public static double[,] Forward(ContinuousHiddenMarkovModel model, double[][] observations,
                                        out double logLikelihood)
        {
            double[] coefficients;
            double[,] fwd = Forward(model, observations, out coefficients);

            logLikelihood = 0;
            for (int i = 0; i < coefficients.Length; i++)
                logLikelihood += System.Math.Log(coefficients[i]);

            return fwd;
        }
Example #11
0
 public HMM(ContinuousHiddenMarkovModel signHMM)
 {
     CHMM = signHMM;
 }