private void learnButton_Click(object sender, RoutedEventArgs e) { ReadSequenceBox(); ReadCharBox(); ReadStateBox(); ReadLikelihoodBox(); int[][] sequenceArray = SequenceListToArray(); hmm = new HiddenMarkovModel(alphabet, states); hmm.Learn(sequenceArray, likelihood); }
public override void Learn(SequenceData trainingData, SequenceData validationData, SequenceData testData) { //hmm = SparseHiddenMarkovModel.FromCompleteGraph(2, trainingData.NumSymbols); hmm = new HiddenMarkovModel(trainingData.NumSymbols, 4); double likelihood = 0.0; double newLikelihood = Double.MinValue; do { //HMMGraph graph = hmm.ToGraph(); HMMGraph graph = ModelConverter.HMM2Graph(hmm); //CutEdges(graph, epsilon); double[] viterbyScores = ComputeViterbyScores(validationData, true); int[] statesToSplit = IdentifyWeakStates(viterbyScores).ToArray(); foreach (int weakPoint in statesToSplit) { SplitState(graph, weakPoint); } WriteLine(String.Format("Added {0} states", statesToSplit.Length)); //WriteLine(String.Format("Removed {0} states", RemoveUnpopularStates(graph, viterbyScores))); //hmm = SparseHiddenMarkovModel.FromGraph(graph); hmm = ModelConverter.Graph2HMM(graph); WriteLine("Running Baum Welch..."); //hmm.Learn(trainingData.GetNonempty(), 0.0, 8); hmm.Learn(trainingData.GetNonempty(), 8); likelihood = newLikelihood; newLikelihood = 0.0; foreach (int[] signal in validationData.GetNonempty()) { newLikelihood += hmm.Evaluate(signal, true); } WriteLine(String.Empty); WriteLine(String.Format("Number of HMM States: {0}", NumberOfStates)); //WriteLine(String.Format("Transition Sparsity; {0}", hmm.TransitionSparsity)); WriteLine(String.Format("Log Likelihood: {0}", newLikelihood)); WriteLine(String.Empty); } while (Math.Abs(newLikelihood - likelihood) > convergenceThreshold); }
public override void Learn(SequenceData trainingData, SequenceData validationData, SequenceData testData) { //trainingData.AddSequences(validationData); double[] initialProbabilities = new double[states]; double sum = 0.0; for (int k = 0; k < states; k++) { initialProbabilities[k] = random.NextDouble(); sum += initialProbabilities[k]; } for (int k = 0; k < states; k++) { initialProbabilities[k] /= sum; } double[,] transitionMatrix = new double[states, states]; for (int k = 0; k < states; k++) { sum = 0.0; for (int l = 0; l < states; l++) { transitionMatrix[k, l] = random.NextDouble(); sum += transitionMatrix[k, l]; } for (int l = 0; l < states; l++) { transitionMatrix[k, l] /= sum; } } double[,] emissionMatrix = new double[states, testData.NumSymbols]; for (int k = 0; k < states; k++) { sum = 0.0; for (int l = 0; l < testData.NumSymbols; l++) { emissionMatrix[k, l] = random.NextDouble(); sum += emissionMatrix[k, l]; } for (int l = 0; l < testData.NumSymbols; l++) { emissionMatrix[k, l] /= sum; } } //hmm = new HiddenMarkovModel(trainingData.NumSymbols, states); hmm = new HiddenMarkovModel(transitionMatrix, emissionMatrix, initialProbabilities); Stopwatch sw = new Stopwatch(); sw.Start(); hmm.Learn(trainingData.GetNonempty(), tolerance); sw.Stop(); Console.WriteLine(sw.Elapsed.TotalSeconds); }
public void EquivalenceTest() { double[] pi = new double[]{0.23, 0.52, 0.25}; double[,] A = new double[,]{{ 3.0 / 6.0, 2.0 / 6.0, 1.0 / 6.0 }, { 11.0 / 17.0, 2.0 / 17.0, 4.0 / 17.0}, {4.0 / 20.0, 7.0 / 20.0, 9.0 / 20.0}}; double[,] B = new double[,]{{ 1.0 / 6.0, 1.0 / 6.0, 4.0 / 6.0 }, { 2.0 / 17.0, 3.0 / 17.0, 12.0 / 17.0}, {13.0 / 20.0, 2.0 / 20.0, 5.0 / 20.0}}; int[][] observations = new int[][]{ new int[] {0, 0, 1, 2, 1, 1, 1, 2, 0, 0, 0, 1, 2, 1, 2, 1, 0, 1}, new int[] {1, 1, 2, 1, 2, 0}, new int[] {1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 2, 1, 2, 1}, new int[] {1, 1, 2, 1, 0, 0, 2, 1, 0, 1, 1, 1}, new int[] {1, 2, 2, 0, 2}, new int[] {1, 1, 1, 1, 2, 1, 2, 1} }; //Run BW with 20 iterations HiddenMarkovModel hmm = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi)); hmm.Learn(observations, 20); HiddenMarkovModel hmmLM = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi)); hmmLM.Learn(observations, 20); for (int i = 0; i < hmm.Probabilities.Length; i++) Assert.AreEqual(hmm.Probabilities[i], hmmLM.Probabilities[i]); for (int i = 0; i < hmm.Transitions.GetLength(0); i++) for (int p = 0; p < hmm.Transitions.GetLength(1); p++) Assert.AreEqual(hmm.Transitions[i, p], hmmLM.Transitions[i, p]); for (int i = 0; i < hmm.Emissions.GetLength(0); i++) for (int p = 0; p < hmm.Emissions.GetLength(1); p++) Assert.AreEqual(hmm.Emissions[i, p], hmmLM.Emissions[i, p]); //Run BW with 1 iteration hmm = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi)); hmm.Learn(observations, 1); hmmLM = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi)); hmmLM.Learn(observations, 1); for (int i = 0; i < hmm.Probabilities.Length; i++) Assert.AreEqual(hmm.Probabilities[i], hmmLM.Probabilities[i]); for (int i = 0; i < hmm.Transitions.GetLength(0); i++) for (int p = 0; p < hmm.Transitions.GetLength(1); p++) Assert.AreEqual(hmm.Transitions[i, p], hmmLM.Transitions[i, p]); for (int i = 0; i < hmm.Emissions.GetLength(0); i++) for (int p = 0; p < hmm.Emissions.GetLength(1); p++) Assert.AreEqual(hmm.Emissions[i, p], hmmLM.Emissions[i, p]); //Run BW with threshold 0.1 hmm = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi)); hmm.Learn(observations, 0.1); hmmLM = new HiddenMarkovModel(Clone(A), Clone(B), Clone(pi)); hmmLM.Learn(observations, 0.1); for (int i = 0; i < hmm.Probabilities.Length; i++) Assert.AreEqual(hmm.Probabilities[i], hmmLM.Probabilities[i]); for (int i = 0; i < hmm.Transitions.GetLength(0); i++) for (int p = 0; p < hmm.Transitions.GetLength(1); p++) Assert.AreEqual(hmm.Transitions[i, p], hmmLM.Transitions[i, p]); for (int i = 0; i < hmm.Emissions.GetLength(0); i++) for (int p = 0; p < hmm.Emissions.GetLength(1); p++) Assert.AreEqual(hmm.Emissions[i, p], hmmLM.Emissions[i, p]); }