スケーリングされたBaum-Welchアルゴリズムを実装しようとしていますが、スケーリング後の後方変数が1の値を超えているという問題に遭遇しました。これは正常ですか?結局のところ、確率は1を超えてはなりません。
私はフォワード変数から取得したスケール係数を使用しています:
ここで、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を超えていることにも注意してください。