コード例 #1
0
        public void Training()
        {
            var model = new HiddenMarkovModel(5, 5);

            model.InitialStateProbabilities = new double[] { 0.1, 0.3, 0.1, 0.4, 0.1 };

            // all emission P should be 0.2
            Assert.IsTrue(model.EmissionProbabilities.Cast<double>().All(e => e == 0.2));

            int[] observations = new int[] { 4, 2, 3, 0, 1, 3, 2 };
            int[] observations2 = new int[] { 3, 4, 0, 2, 1, 1, 4, 1, 3, 2 };

            var sequence = Enumerable.Repeat(observations, 10);
            var sequence2 = Enumerable.Repeat(observations2, 10);

            model.train(sequence);

            Assert.AreEqual(model.EmissionProbabilities[1, 2], 0.25491738788355622);
            Assert.AreEqual(model.EmissionProbabilities[3, 1], 0.087887575284407757);

            model.train(sequence2);

            Assert.AreEqual(model.EmissionProbabilities[1, 2], 0.0096840128278279109);
            Assert.AreEqual(model.EmissionProbabilities[3, 1], 0.10439889167415384);
            Assert.AreEqual(model.TransitionProbabilities[1, 3], 0.35392973024268204);
        }
コード例 #2
0
ファイル: GestureModel.cs プロジェクト: R0lin/LeapGestures
 /** Creates a Unit (Quantizer&Model).
  *
  * @param id
  *  int representation of a gesture "name"/class.
  */
 public GestureModel()
 {
     this.numStates = 15; // states empirical value
     this.numObservations = 20; // observations empirical value
     this.markovmodell = new HiddenMarkovModel(numStates, numObservations); // init model
     this.quantizer = new Quantizer(numStates); // init quantizer
 }
コード例 #3
0
        public void Evaluation()
        {
            // based on http://en.wikipedia.org/wiki/Hidden_Markov_model#A_concrete_example

            var model = new HiddenMarkovModel(2, 3);

            model.InitialStateProbabilities = new double[] { 0.6, 0.4 };

            model.TransitionProbabilities = new double[,]
            {
                { 0.7, 0.3 },
                { 0.4, 0.6 }
            };

            model.EmissionProbabilities = new double[,]
            {
                { 0.1, 0.4, 0.5 },
                { 0.6, 0.3, 0.1 }
            };

            int[] observations = new int[] { 1, 2, 0 };

            // hand calculate probability by summing probability of this observation sequence
            // over all possible state sequences

            /* State sequences:
             *    0, 0, 0 : Pa = 0.6 * 0.7 * 0.7 = 0.294
             *    0, 0, 1 : Pb = 0.6 * 0.7 * 0.3 = 0.126
             *    0, 1, 0 : Pc = 0.6 * 0.3 * 0.4 = 0.072
             *    0, 1, 1 : Pd = 0.6 * 0.3 * 0.6 = 0.108
             *    1, 0, 0 : Pe = 0.4 * 0.4 * 0.7 = 0.112
             *    1, 0, 1 : Pf = 0.4 * 0.4 * 0.3 = 0.048
             *    1, 1, 0 : Pg = 0.4 * 0.6 * 0.4 = 0.096
             *    1, 1, 1 : Ph = 0.4 * 0.6 * 0.6 = 0.144
             * Sanity check, yes they sum to 1
             */

            /* Output (1, 2, 0) given state sequence:
             *    P(o|a) = 0.4 * 0.5 * 0.1 = 0.02
             *    P(o|b) = 0.4 * 0.5 * 0.6 = 0.12
             *    P(o|c) = 0.4 * 0.1 * 0.1 = 0.004
             *    P(o|d) = 0.4 * 0.1 * 0.6 = 0.024
             *    P(o|e) = 0.3 * 0.5 * 0.1 = 0.015
             *    P(o|f) = 0.3 * 0.5 * 0.6 = 0.09
             *    P(o|g) = 0.3 * 0.1 * 0.1 = 0.003
             *    P(o|h) = 0.3 * 0.1 * 0.6 = 0.018
             */

            // Final probability = P(o|a)*P(a) + ... + P(o|h)*P(h) =
            // 0.00588 + 0.01512 + 0.000288 + 0.002592 + 0.00168 + 0.00432 + 0.000288 + 0.002592 = 0.03276

            var modelProbability = model.getProbability(observations);

            Assert.AreEqual(modelProbability, 0.03276);
        }