/// <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; var A = model.Transitions; var B = model.Emissions; var pi = model.Probabilities; int T = observations.Length; double[,] 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 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 = ForwardBackwardAlgorithm.Forward(model, observations, out coefficients); logLikelihood = 0; for (int i = 0; i < coefficients.Length; i++) { logLikelihood += System.Math.Log(coefficients[i]); } 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; var A = model.Transitions; var B = model.Emissions; var pi = model.Probabilities; int T = observations.Length; double[,] 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> /// Creates a new instance of the Baum-Welch learning algorithm. /// </summary> public ContinuousBaumWelchLearning(ContinuousHiddenMarkovModel model) : base(model) { this.model = model; }