使用维特比算法的隐马尔可夫模型来纠正拼写错误

我想使用带有维特比算法的隐马尔可夫模型来纠正拼写错误,我已经计算了所需的概率,但当我应用维特比算法时,得到的结果非常差,我逐行检查了代码却找不到错误

public ForwardViterbi(string[] states, string[] observations, double[] startProbability, double[,] transitionProbability, double[,] emissionProbability, double scaleFactor)        {            this.states = states;            this.observations = observations;            this.startProbability = startProbability;            this.transitionProbability = transitionProbability;            this.emissionProbability = emissionProbability;            this.scaleFactor = scaleFactor;        }        //----------------------------------------------------------------------        //The Methods        public void Process(int[] problem)        {            double[,] T = new double[states.Length, 3];  //We will store the probability sequence for the Viterbi Path            vPath = new int[problem.Length];            vProbs = new double[problem.Length];            //initialize T            //------------------------------------------------------------------                for (int state = 0; state < states.Length; state++)            {                T[state, 0] = startProbability[state];                T[state, 1] = state;                T[state, 2] = startProbability[state];            }            for (int output = 0; output < problem.Length; output++)            {                double[,] U = new double[states.Length, 3];  //We will use this array to calculate the future probabilities                Console.WriteLine("\nTesting hypothesis {0} ({1})", output, observations[problem[output]]);                double highest = 0;                for (int nextState = 0; nextState < states.Length; nextState++)                {                    double total = 0;                    double argMax = 0;                    double valMax = 0;                    Console.WriteLine("  Estimating probability for future state {0} ({1})", nextState, states[nextState]);                    for (int state = 0; state < states.Length; state++)                    {                        Console.WriteLine("    The testing state is {0} ({1})", states[state], state);                        double prob = T[state, 0];                        double v_path = T[state, 1];                        double v_prob = T[state, 2];                        double p = emissionProbability[state, problem[output]] * transitionProbability[state, nextState] * scaleFactor;                        prob *= p;                        v_prob *= p;                        total += prob;                        if (v_prob > valMax)                        {                            valMax = v_prob;                            argMax = nextState;                        }                        Console.WriteLine("    VProbability of {0} is {1} with scale {2}^{3}", states[nextState], v_prob, scaleFactor, output + 1);                        if (v_prob > highest)                        {                            highest = v_prob;                            vPath[output] = nextState;                            vProbs[output] = v_prob;                        }                    }                    U[nextState, 0] = total;                    U[nextState, 1] = argMax;                    U[nextState, 2] = valMax;                }                T = U;                Console.WriteLine("The highest probability was {0} in state {1} (scale factor of {2}^{3})", highest, states[vPath[output]], scaleFactor, output + 1);            }            //Apply SumMax            double Total = 0;            double ValMax = 0;            for (int state = 0; state < states.Length; state++)            {                double prob = T[state, 0];                double v_path = T[state, 1];                double v_prob = T[state, 2];                Total += prob;                if (v_prob > ValMax)                {                    ValMax = v_prob;                }            }            Console.WriteLine("\nAnalysis: Total probability (sum of all paths) for the given state is :: {0}\nThe Viterbi Path Probability is :: {1}", Total, ValMax);            Console.WriteLine("The above results are presented with a scale factor of {0}^{1}", scaleFactor, problem.Length);        }

回答:

我刚刚检查了这个实现和维基百科上发布的那个。这个似乎不起作用。维基百科上的那个确实有效。如果你愿意 – 你可以比较它们,但我懒得做这个。

(我已经为你描述的问题实现了这里的解决方案)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注