public LikelihoodSimple(int[] o, HMM_QPN model) { O = o; Debug.WriteLine("O: "); for (int i = 0; i < O.Length; i++) { Debug.Write(O[i] + " "); } Debug.WriteLine("__"); 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 Probability(int t) { int d = Model.MaxPeriodOverall(); if (t <= 0) { return(1); } else if (P[t] != -1) { return(P[t]); } else { double sum = 0; for (int i = 0; i < Model.n; i++) { // System.Diagnostics.Debug.Write("+"); // for (int d = 1; d <= Model.MaxPeriodOverall(); d++) //{ //Пусть у нас только одна длительность d=D double prod = Probability(t - d); // System.Diagnostics.Debug.Write("(P[O_{" + (t - d) + "}]="+prod+")"); // если первый множитель 0, то остальные можно не считать. if (prod != 0F) { double alph = Alpha(i, d, t); prod *= alph; // System.Diagnostics.Debug.Write("* (Alpha(" + i + ", " + d + ", "+t+")="+alph+")"); } if (prod != 0F) { double br = b(i, d, t); prod *= br; // System.Diagnostics.Debug.Write("* (b(" + i + ", " + d + ", "+t+")="+br+")"); } sum += prod; // } } if (t == 30) { } P[t] = sum; return(sum); } }
public Likelihood(int[] o, HMM_QPN 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; for (int j = 0; j < Model.n; j++) for (int d = 1; d <= Model.MaxPeriodOverall(); d++) 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) prod *= b(j, d, t - d1 + d); sum += prod; if (sum > 1) { } } return sum; }