問題タブ [viterbi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - HMM Error in if (d < delta) { : TRUE/FALSE が必要な場所に値がありません
HMM パッケージの viterbiTraining 関数に問題があります。私は非常に単純なうーんと観測のベクトルでそれを使用しようとしました。
コードは次のとおりです。
Emisije ベクトルは次のようになります。
頭(エミシジェ)
[1] 「インターバルA」「インターバルA」「インターバルA」「インターバルC」「インターバルB」「インターバルA」
これを実行すると、viterbiTraining 関数を除いてすべてが機能し、次の結果が得られます。
viterbiTraining(スタンジ、エミシジェ)
if (d < delta) { のエラー: TRUE/FALSE が必要な場所に値がありません
まったく同じパラメーターを取る同様の関数 baumWelch でさえ、エラーなしで動作するため、ここで何が問題なのか本当にわかりません。
誰が私が間違っているのか説明してもらえますか? 前もって感謝します。
algorithm - k > 隠れ状態の数である HMM の上位 k ベスト パス
here で説明されているように、HMM を介して k-best パスを抽出するために、k-best ビタビ アルゴリズムを実装しました。ただし、kが隠れ状態の数より大きい場合はエラーが発生します。
以下を考慮してください: 時間tでの最初の観測では、各状態jのすべてのkは同じです (つまり、最初の観測であるため、その状態へのすべてのパスは同じです)。次に、時間t+1 における状態iの k-best パスを計算します。そのために、時間tで k-best 先行パスを抽出します。ただし、 tでの各状態のすべてのパスは同じであるため、状態iのk回同じ最良の先行状態になります (同じことが時間t+1でのすべての状態に適用されます)。これにより、事実上、すべてのパスが同じパスになります (1st-best)。
文献で示唆されているように、k-best の先行状態を探す際に既に取られたパスを無視しました。ただし、これにより、時間tにN個の異なるパスが事実上残ります。Nは隠れた状態の数を指します。そのため、 kをNよりも大きく選択すると、時間tで k-best 先行パスを探すときにエラーが発生します。
私が言おうとしている点がうまくいったことを願っています。明らかに、ここで何かが欠けていますが、何がわかりません。
c# - 結合された単語を分割するために C# で Viterbi アルゴリズムを実装するにはどうすればよいですか?
要するに、ここでの質問に対する最初の回答をPython から C# に変換したいと思います。結合された単語を分割するための現在のソリューションは指数関数的であり、線形ソリューションが必要です。入力テキストにスペースがなく、大文字と小文字が一貫していると想定しています。
バックグラウンド
「wickedweather」などの結合された文字列を、C# を使用して「wicked weather」などの個別の単語に変換したいと考えています。指数時間を使用する再帰関数である実用的なソリューションを作成しましたが、これは私の目的には十分に効率的ではありません (少なくとも 100 個以上の結合された単語を処理する)。これまでに読んだ質問は参考になると思いますが、回答を Python から C# に翻訳することはできません。
私の現在の再帰的ソリューション
これは、C# でいくつかの単語 (< 50) を分割したいだけで、効率はあまり気にしない人向けです。
私の現在のソリューションは、単語のすべての可能な組み合わせを解決し、最も可能性の高い出力と表示を見つけます。私は現在、最も可能性の高い出力を、個々の単語が最も長いものとして定義しています。別の方法を使用したいと考えています。これが、再帰アルゴリズムを使用した私の現在のソリューションです。
このアルゴリズムは、入力テキストにスペースやその他の記号がないことに依存しています (ここでは実際には問題ではありません。句読点の分割については気にしていません)。辞書内にアルファベットの各文字を「単語」として保存しない限り、文字列内にランダムに文字を追加すると、エラーが発生する可能性があります。これは、「wickedweatherdykjs」が上記のアルゴリズムを使用して「wicked weather dykj s」を返すことを意味しますが、「wicked weather dykjs」の出力を好む場合です。
私の更新された指数ソリューション:
ビタビ アルゴリズムの使用方法
アルゴリズムに提供するテキスト ファイル内の単語の位置に応じて確率が計算される、結合された文字列に対する最も可能性の高い解決策を導き出すアルゴリズムを作成したいと思います。ファイルが最初に英語で最も一般的な単語から始まり、次の行で 2 番目に一般的な単語というように、私の辞書で最も一般的でない単語まで続きます。ざっくりこんな感じ
- の
- なれ
- と
- ...
- 弁護士
これは、私が使用したいテキストファイルの小さな例へのリンクです。 これは、私が使用したいはるかに大きなテキストファイルです
このファイル配置の背後にあるロジックは次のとおりです...
それらが Zipf の法則に従うと仮定するのは合理的です。つまり、単語のリストでランク n の単語は、およそ 1/(n log N) の確率を持ちます。ここで、N は辞書内の単語の数です。
Generic Human は、彼の優れた Python ソリューションで、これを私よりもはるかにうまく説明しています。問題に対する彼のソリューションを Python から C# に変換したいと考えていますが、これを試行するのに何時間も費やした後も、有効なソリューションを作成できませんでした。また、Viterbi アルゴリズムを使用した相対頻度は単語を分割する最良の方法ではないという考えにもオープンなままです。C# を使用してソリューションを作成するための他の提案はありますか?
parsing - Viterbi CYK と Probabilistic CYK アルゴリズムの違いは何ですか?違いはありますか?
それらは同じ概念だと思い ます https://courses.engr.illinois.edu/cs498jh/Slides/Lecture10.pdf 確率的 CYK アルゴリズムがビタビ アルゴリズムを使用して解析されますが、私の概念は正しいですか?