public LikelihoodFerguson(int[] o, FergusonModel model) { O = o; Model = model; int D = model.MaxPeriodOverall(); alpha = new double[model.n, D + 1, o.Length + Model.MaxPeriodOverall()]; P = new double[o.Length + Model.MaxPeriodOverall()]; for (int r = 0; r < o.Length + Model.MaxPeriodOverall(); r++) { for (int i = 0; i < model.n; i++) { for (int d = 0; d <= D; d++) { alpha[i, d, r] = -1; } } P[r] = -1; } }
/// <summary> /// Вероятность наблюдать последовательность O_{1:T} при предположении, что /// 1) Первое состояние началось в момент времени 1 или до этого /// 2) Последнее состояние закончилось в момент времени T или после него. /// </summary> /// <param name="t">T</param> /// <returns></returns> public double FullProbability(int t) { double sum = 0; int count = 0; for (int j = 0; j < Model.n; j++) { for (int d = 1; d <= Model.MaxPeriodOverall(); d++) { if (Model.ProbabilityByValueAndState(d, j) != 0F) { for (int d1 = 1; d1 <= d; d1++) { double prod = (1D / d) * Probability(t - d1); if (prod != 0F) { prod *= Alpha(j, d, t - d1 + d); } if (prod != 0F) { // Debug.WriteLine("fullprod(" + j + ", " + d1 + ", " + t + "): "); prod *= b(j, d, t - d1 + d); } Debug.WriteLine("prod(" + j + ", " + d + ", " + d1 + "): " + prod); count++; Debug.WriteLine("count= " + count); sum += prod; if (sum > 1) { } } } } } return(sum); }