/// <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); }
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); }
/// <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; }
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); }
/// <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; }
public HMM(ContinuousHiddenMarkovModel signHMM) { CHMM = signHMM; }