public int[] PredictObservationSequence(int T) { var emission = MathE.eexpify(logEmission); var transition = MathE.eexpify(logTransition); var pi = MathE.eexpify(logPi); List <int> O = new List <int>(); Random rand = new Random(); int[] states_ = new int[states]; for (int j = 0; j < states; j++) { states_[j] = j; } int state = RouletteSelection <int>(states_, pi, rand); for (int t = 0; t < T; t++) { // Get next observation state double[] probabilities = new double[observationSymbols]; int[] observations = new int[observationSymbols]; bool stop = true; for (int j = 0; j < observationSymbols; j++) { probabilities[j] = emission[state, j]; observations[j] = j; if (probabilities[j] > 0) { stop = false; } } if (stop) { break; } int winner = RouletteSelection <int>(observations, probabilities, rand); O.Add(winner); stop = true; // Proceed to next hidden state probabilities = new double[states]; int[] nextStates = new int[states]; for (int j = 0; j < states; j++) { probabilities[j] = transition[state, j]; nextStates[j] = j; if (probabilities[j] > 0) { stop = false; } } if (stop) { break; } winner = RouletteSelection <int>(nextStates, probabilities, rand); state = winner; } return(O.ToArray()); }
public double[,] CalculateGamma(int[] O) { return(MathE.eexpify(CalculateLogGamma(O))); }