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

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

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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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