public void LearnTest8()
{
// Declare some testing data
int[][] inputs = new double[][]
{
new double[] { 0,0,1,2 }, // Class 0
new double[] { 0,1,1,2 }, // Class 0
new double[] { 0,0,0,1,2 }, // Class 0
new double[] { 0,1,2,2,2 }, // Class 0
new double[] { 2,2,1,0 }, // Class 1
new double[] { 2,2,2,1,0 }, // Class 1
new double[] { 2,2,2,1,0 }, // Class 1
new double[] { 2,2,2,2,1 }, // Class 1
}.ToInt32();
int[] outputs = new int[]
{
0,0,0,0, // First four sequences are of class 0
1,1,1,1, // Last four sequences are of class 1
};
// We are trying to predict two different classes
int classes = 2;
// Each sequence may have up to 3 symbols (0,1,2)
int symbols = 3;
// Nested models will have 3 states each
int[] states = new int[] { 3, 3 };
// Creates a new Hidden Markov Model Classifier with the given parameters
var classifier = HiddenMarkovClassifier.CreateGeneric2(classes, states, symbols);
// Create a new learning algorithm to train the sequence classifier
var teacher = new HiddenMarkovClassifierLearning<GeneralDiscreteDistribution, int>(classifier)
{
// Train each model until the log-likelihood changes less than 0.001
Learner = modelIndex => new BaumWelchLearning<GeneralDiscreteDistribution, int>(classifier.Models[modelIndex])
{
Tolerance = 0.001,
Iterations = 0
}
};
// Enable support for sequence rejection
teacher.Rejection = true;
// Train the sequence classifier using the algorithm
teacher.Learn(inputs, outputs);
double likelihood = teacher.LogLikelihood;
//Assert.AreEqual(-0.84036002169162149, likelihood);
likelihood = testThresholdModel(inputs, outputs, classifier, likelihood);
}