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);
}