public static double[,] Backward(ContinuousHiddenMarkovModel model, double[][] observations, double[] scaling)
{
int states = model.States;
double[,] A = model.Transitions;
IDistribution[] B = model.Emissions;
double[] pi = model.Probabilities;
int T = observations.Length;
var bwd = new double[T,states];
// For backward variables, we use the same scale factors
// for each time t as were used for forward variables.
// 1. Initialization
for (int i = 0; i < states; i++)
bwd[T - 1, i] = 1.0/scaling[T - 1];
// 2. Induction
for (int t = T - 2; t >= 0; t--)
{
for (int i = 0; i < states; i++)
{
double sum = 0;
for (int j = 0; j < states; j++)
sum += A[i, j]*B[j].ProbabilityFunction(observations[t + 1])*bwd[t + 1, j];
bwd[t, i] += sum/scaling[t];
}
}
return bwd;
}
}