public void LearnTest2()
{
Accord.Math.Tools.SetupGenerator(0);
double[][][] sequences = new double[500][][];
for (int i = 0; i < sequences.Length; i++)
{
sequences[i] = new double[Accord.Math.Tools.Random.Next(20, 80)][];
int start = Accord.Math.Tools.Random.Next();
for (int j = 0; j < sequences[i].Length; j++)
{
double s = Math.Sin(j + start);
double u = ((s + 1) / 2.0);
sequences[i][j] = new double[] { (int)(u * 10) };
}
}
HiddenMarkovModel<GeneralDiscreteDistribution> hmm1;
double ll1;
{
Accord.Math.Tools.SetupGenerator(0);
hmm1 = HiddenMarkovModel.CreateGeneric(10, 10, true);
var teacher = new ViterbiLearning<GeneralDiscreteDistribution>(hmm1)
{
Iterations = 1,
Tolerance = 1e-15,
Batches = 1,
UseLaplaceRule = true,
FittingOptions = new GeneralDiscreteOptions
{
UseLaplaceRule = true
}
};
ll1 = teacher.Run(sequences);
}
HiddenMarkovModel<GeneralDiscreteDistribution> hmm10;
double ll10;
{
Accord.Math.Tools.SetupGenerator(0);
hmm10 = HiddenMarkovModel.CreateGeneric(10, 10, true);
var teacher = new ViterbiLearning<GeneralDiscreteDistribution>(hmm10)
{
Iterations = 100,
Tolerance = 1e-15,
Batches = 1,
UseLaplaceRule = true,
FittingOptions = new GeneralDiscreteOptions
{
UseLaplaceRule = true
}
};
ll10 = teacher.Run(sequences);
}
Assert.IsTrue(ll10 > ll1);
Assert.IsTrue(Math.Abs(ll1 - ll10) > 10);
// Those results must match the ones in ViterbiLearningTest.
Assert.AreEqual(-33.834836461044411, ll1);
Assert.AreEqual(-23.362967205628703, ll10);
Assert.IsFalse(AreEqual(hmm1, hmm10));
}