public void LearnTest3()
{
double[][] sequences = new double[][]
{
new double[] { 0,1,1,1,1,0,1,1,1,1 },
new double[] { 0,1,1,1,0,1,1,1,1,1 },
new double[] { 0,1,1,1,1,1,1,1,1,1 },
new double[] { 0,1,1,1,1,1 },
new double[] { 0,1,1,1,1,1,1 },
new double[] { 0,1,1,1,1,1,1,1,1,1 },
new double[] { 0,1,1,1,1,1,1,1,1,1 },
};
// Creates a new Hidden Markov Model with 3 states
var hmm = HiddenMarkovModel.CreateGeneric(new Forward(3), 2);
// Try to fit the model to the data until the difference in
// the average log-likelihood changes only by as little as 0.0001
var teacher = new ViterbiLearning<GeneralDiscreteDistribution>(hmm)
{
Tolerance = 0.0001,
Iterations = 0,
FittingOptions = new GeneralDiscreteOptions()
{
UseLaplaceRule = true
}
};
double ll = teacher.Run(sequences);
// Calculate the probability that the given
// sequences originated from the model
double l1; hmm.Decode(new double[] { 0, 1 }, out l1); // 0.4999
double l2; hmm.Decode(new double[] { 0, 1, 1, 1 }, out l2); // 0.1145
double l3; hmm.Decode(new double[] { 1, 1 }, out l3); // 0.0000
double l4; hmm.Decode(new double[] { 1, 0, 0, 0 }, out l4); // 0.0000
double l5; hmm.Decode(new double[] { 0, 1, 0, 1, 1, 1, 1, 1, 1 }, out l5); // 0.0002
double l6; hmm.Decode(new double[] { 0, 1, 1, 1, 1, 1, 1, 0, 1 }, out l6); // 0.0002
ll = System.Math.Exp(ll);
l1 = System.Math.Exp(l1);
l2 = System.Math.Exp(l2);
l3 = System.Math.Exp(l3);
l4 = System.Math.Exp(l4);
l5 = System.Math.Exp(l5);
l6 = System.Math.Exp(l6);
Assert.AreEqual(1.754393540912413, ll, 1e-6);
Assert.AreEqual(0.53946360153256712, l1, 1e-6);
Assert.AreEqual(0.44850249229903377, l2, 1e-6);
Assert.AreEqual(0.08646414524833077, l3, 1e-6);
Assert.AreEqual(0.00041152263374485, l4, 1e-6);
Assert.AreEqual(0.01541807695931400, l5, 1e-6);
Assert.AreEqual(0.01541807695931400, l6, 1e-6);
Assert.IsTrue(l1 > l3 && l1 > l4);
Assert.IsTrue(l2 > l3 && l2 > l4);
Assert.AreEqual(1, hmm.Dimension);
}