1

隠れマルコフ モデルを使用する必要があるプロジェクトに取り組んでいます。Kevin Murphy のツールボックスをダウンロードしました。使用上の問題がいくつかあります。ツールボックスの Web ページで、彼は dhmm_em と dhmm_logprob の最初の入力がシンボル シーケンス データであると述べています。彼らの例では、行ベクトルをデータとして与えています。したがって、シンボル シーケンスを行ベクトルとして指定すると、エラーが発生します。

??? Error using ==> assert at 9
assertion violated:

Error in ==> fwdback at 105
assert(approxeq(sum(alpha(:,t)),1))

Error in ==> dhmm_logprob at 17
  [alpha, beta, gamma, ll] = fwdback(prior,
  transmat, obslik, 'fwd_only', 1);

Error in ==> mainCourseProject at 110
            loglik(train_act) =
            dhmm_logprob(orderedSymbols,
            hmm{train_act}.prior,
            hmm{train_act}.trans,
            hmm{act}.emiss);

ただし、このエラーが発生する前に、コードはいくつかのシンボル ベクトルに対して機能します。データを列ベクトルとして与えると、関数は正常に動作し、エラーは発生しません。では、なぜこのエラーが発生するのでしょうか?

単一のベクトルではなくベクトル セットを指定する必要があると言うかもしれませんが、特徴ベクトルを構造体に収集して行ベクトルをそのまま指定しようとしましたが、何も変更されず、まだアサーション エラーが発生します。

ちなみに、私のシンボルシーケンスにはゼロがありません。例で示したのとほぼ同じようにすべてを行っているので、誰かが私を助けてくれれば幸いです。

4

2 に答える 2

2

よくわかりませんが、上記の関数呼び出しスタックから、最後の行hmm{train_act}.emisshmm{act}.emiss. つまり、シーケンスの対​​数確率を計算するときは、同じ HMM モデル (遷移行列、放出行列、事前確率) に属するコンポーネントを渡す必要があります。

ところで、コード内の ASSERT は、確率のベクトルの合計が になるようにするサニティ チェックです1。多くの場合、非常に小さな値 (対数確率) を扱う場合、数値の安定性の問題が忍び寄る可能性があります... APPROXEQ 関数を編集して、誤差の範囲を大きくすることで、比較を少し緩和することができます。

于 2012-06-12T16:24:27.200 に答える
1

このエラー メッセージとそれが参照するコードは、人間が判読できます。アサーションは、特定の条件が満たされていることを確認するために、プログラマーが設定するガードです。この場合、条件は何ですか? approxeq(sum(alpha(:,t)),1) 私はあえて言うと、 approxeq は値がほぼ等しくなることを望んでいるので、これは次のようになります。sum(alpha(:,t)) ~= 1

コードについて何も知らなくても、これらは確率を指していると思います。ノードのエッジの確率の合計は 1 でなければなりません。これにより、生産的なデバッグ パスを開始できることを願っています。この状態を生成する入力の何が問題なのかがわからない場合は、コードを少し調べて、このアルファ ベクトルがどこから来て、どのように無効になったかを確認してください。

于 2012-06-12T15:17:34.377 に答える