Accord.NET (logo) BaumWelchLearning Class Accord.NET Framework
Online Show table of contents (goes to the online documentation index).
Baum-Welch learning algorithm for discrete-density Hidden Markov Models.
Inheritance Hierarchy

Online System Object
  Accord.Statistics.Models.Markov.Learning BaseBaumWelchLearning
    Accord.Statistics.Models.Markov.Learning BaumWelchLearning

Namespace: Accord.Statistics.Models.Markov.Learning
Assembly: Accord.Statistics (in Accord.Statistics.dll) Version: 2.9.0.0 (2.9.0.0)
Syntax

Remarks

The Baum-Welch algorithm is a kind of Expectation-Maximization algorithm. For discrete models, it estimates the matrix of state transition probabilities A, the matrix of symbol emission probabilities B and the vector of initial state probabilities pi. For increased accuracy, all computations are performed using log-probabilities.

Examples

// We will try to create a Hidden Markov Model which 
//  can detect if a given sequence starts with a zero 
//  and has any number of ones after that. 
int[][] sequences = new int[][] 
{
    new int[] { 0,1,1,1,1,0,1,1,1,1 },
    new int[] { 0,1,1,1,0,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1         },
    new int[] { 0,1,1,1,1,1,1       },
    new int[] { 0,1,1,1,1,1,1,1,1,1 },
    new int[] { 0,1,1,1,1,1,1,1,1,1 },
};

// Creates a new Hidden Markov Model with 3 states for 
//  an output alphabet of two characters (zero and one)
HiddenMarkovModel hmm = new HiddenMarkovModel(3, 2);

// Try to fit the model to the data until the difference in 
//  the average log-likelihood changes only by as little as 0.0001 
var teacher = new BaumWelchLearning(hmm) { Tolerance = 0.0001, Iterations = 0 };
double ll = teacher.Run(sequences);

// Calculate the probability that the given 
//  sequences originated from the model 
double l1 = hmm.Evaluate(new int[] { 0, 1 });       // 0.999 
double l2 = hmm.Evaluate(new int[] { 0, 1, 1, 1 }); // 0.916 

// Sequences which do not start with zero have much lesser probability. 
double l3 = hmm.Evaluate(new int[] { 1, 1 });       // 0.000 
double l4 = hmm.Evaluate(new int[] { 1, 0, 0, 0 }); // 0.000 

// Sequences which contains few errors have higher probabability 
//  than the ones which do not start with zero. This shows some 
//  of the temporal elasticity and error tolerance of the HMMs. 
double l5 = hmm.Evaluate(new int[] { 0, 1, 0, 1, 1, 1, 1, 1, 1 }); // 0.034 
double l6 = hmm.Evaluate(new int[] { 0, 1, 1, 1, 1, 1, 1, 0, 1 }); // 0.034
See Also