HMM Baum-Welchでの後方変数のスケーリング


9

スケーリングされたBaum-Welchアルゴリズムを実装しようとしていますが、スケーリング後の後方変数が1の値を超えているという問題に遭遇しました。これは正常ですか?結局のところ、確率は1を超えてはなりません。

私はフォワード変数から取得したスケール係数を使用しています:

ct=1/sSαt(s)
ここで、c_tは時間tのスケーリング係数、alphaは前方変数、sはhmmの状態です。

後方アルゴリズムについては、以下のJavaで実装しました。

public double[][] backwardAlgo(){
        int time = eSequence.size();
        double beta[][] = new double[2][time];

        // Intialize beta for current time
        for(int i = 0; i < 2; i++){
            beta[i][time-1] = scaler[time-1];
        }

        // Use recursive method to calculate beta
        double tempBeta = 0;
        for(int t = time-2; t >= 0; t--){
            for(int i = 0; i < 2; i++){
                for(int j = 0; j < 2; j++){
                    tempBeta = tempBeta + (stateTransitionMatrix[i][j] * emissionMatrix[j][eSequence.get(t+1)] * beta[j][t+1]);
                }
                beta[i][t] = tempBeta;
                beta[i][t] = scaler[t] * beta[i][t];
                tempBeta = 0;
            }
        }
        return beta;
    }

スケールは、スケーラーと呼ばれる配列に格納されます。このうーんには2つの状態があります。また、取得しているスケールファクターも1を超えていることにも注意してください。

回答:


0

これ自体は問題を示していません。は、までの観測された出力シーケンスがあった確率です。したがって、が1より大きいことは問題ありません。また、たとえば場合、それは、1つを超える場合もあります。T T 0T 1... C T β T iは、mはE - 1 Σ S S β T iは、mはE - 1S = | S | c t1sSαt(s)tt0,t1,, eSequence.get(t)ctβtime1sSβtime1(s)=|S|ct1


0

スケーリングされた表すので、私は別のアイデアを持っていますβ

βt(s)=p(xt+1,...,xN|st=s)p(xt+1,...,xN|x1,...,xt)

したがって、は1を超える可能性があると思います。β

このメモを参照(8ページ)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.