コード例 #1
0
        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;
            }
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
 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;
     }
 }
コード例 #4
0
        /// <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;
        }