Accord.Tests.Statistics.Models.Markov.ForwardBackwardAlgorithmTest.BackwardTest C# (CSharp) Method

BackwardTest() private method

private BackwardTest ( ) : void
return void
        public void BackwardTest()
        {
            HiddenMarkovModel hmm = CreateModel2();

            //                     A  B  B  A
            int[] observations = { 0, 1, 1, 0 };

            double logLikelihood;
            double[,] actual = ForwardBackwardAlgorithm.Backward(hmm, observations, out logLikelihood);

            var A = Matrix.Exp(hmm.Transitions);
            var B = Matrix.Exp(hmm.Emissions);
            var P = Matrix.Exp(hmm.Probabilities);

            double a30 = 1;
            double a31 = 1;

            double a20 = A[0, 0] * B[0, 0] * a30 + A[0, 1] * B[1, 0] * a31;
            double a21 = A[1, 0] * B[0, 0] * a30 + A[1, 1] * B[1, 0] * a31;

            double a10 = A[0, 0] * B[0, 1] * a20 + A[0, 1] * B[1, 1] * a21;
            double a11 = A[1, 0] * B[0, 1] * a20 + A[1, 1] * B[1, 1] * a21;

            double a00 = A[0, 0] * B[0, 1] * a10 + A[0, 1] * B[1, 1] * a11;
            double a01 = A[1, 0] * B[0, 1] * a10 + A[1, 1] * B[1, 1] * a11;


            Assert.AreEqual(actual[0, 0], a00);
            Assert.AreEqual(actual[0, 1], a01);

            Assert.AreEqual(actual[1, 0], a10);
            Assert.AreEqual(actual[1, 1], a11);

            Assert.AreEqual(actual[2, 0], a20);
            Assert.AreEqual(actual[2, 1], a21);

            Assert.AreEqual(actual[3, 0], a30);
            Assert.AreEqual(actual[3, 1], a31);


            double p = 0;
            for (int i = 0; i < hmm.States; i++)
                p += actual[0, i] * P[i] * B[i, observations[0]];

            Assert.AreEqual(0.054814695, p, 1e-8);

            p = System.Math.Exp(logLikelihood);
            Assert.AreEqual(0.054814695, p, 1e-8);
        }