2

今日、マルコフ連鎖ジェネレーターについて詳しく読み始めたばかりで、それを構築するプロセス全体に本当に興味をそそられています。私の理解では、将来の状態は現在までの統計的な過去の状態に依存しています。

例:

こんにちは世界。ハロードリー。こんにちは世界。

そのソースでは、「World」が「Hello」の約 66% の後に続きます。

それが常に当てはまる場合、毎回同じ結果を出力しないようにするにはどうすればよいでしょうか。統計的発生は静的文字列では変化しないので、ソースデータが何らかの方法で変更されない限り、バリアントが生成されないと仮定するのは正しいですか?

統計値を考慮しながら、ある程度の柔軟性を確保しながら、静的ソースからバリエーションを取得するにはどうすればよいですか? 上記の例を使用すると、「Dolly」が「Hello」の後に 33% の確率でしか続かない場合、ジェネレーターが「Hello」に「Dolly」を続けられるようにするにはどうすればよいでしょうか?

私が求めているのは、現在の選択に続く単語の統計的存在に基づいて、次の選択の確率をどのように基にすればよいかということです。そうすれば、"Dolly" が 33% の確率で表示され、"World" が 66% の確率で表示されます。

4

2 に答える 2

3

乱数ジェネレーターを使用して、下るパスを選択します。各状態 (実際には N 個の前のアイテムの履歴) とその状態の確率を保存する必要があります。次に、乱数を選び、それに基づいて次の状態を決定します。

あなたの例では、Nが1のマルコフ連鎖があり、次のような連鎖構造になります。

<start> -> Hello : 1.0

Hello -> World. : 0.66666
Hello -> Dolly. : 0.33333

Dolly. -> Hello : 1.0

World. -> <end> : 0.5
World. -> Hello : 0.5

現在の状態が Hello の場合、次に考えられる状態は World です。とドリー.. 0 から 1 の間の乱数を生成し、World を選択します。0.666666 未満の場合は、ドリーを選択します。

N=2 マルコフ連鎖では、その入力でほぼ決定論的な動作が得られます。

<start> <start> -> <start> Hello : 1.0

<start> Hello -> Hello World. : 1.0

Hello World. -> World. Hello : 0.5
Hello World. -> World. <end> : 0.5

World. Hello -> Hello Dolly. : 1.0

Hello Dolly. -> Dolly. Hello : 1.0

Dolly. Hello -> Hello World. : 1.0
于 2009-09-04T21:28:58.237 に答える
0

2 つのコメント:

1) ランダムなプロセスからサンプルを生成するには、特定の選択が非常に (>50%) 可能性が高いかどうかにかかわらず、重み付けされた「コイン投げ」が必要です: [0,1 でランダムな実数を一様に生成します。 )、これまでの確率の合計を維持しながら、同じ固定順序で可能性を検討します。その合計がランダムに選択した数を超えるとすぐに、その選択肢を選択します。選択肢の確率が正規化されていない (合計が 1 にならない) 場合は、最初に確率の合計 s を計算し、それらをすべて s で割るか、[0,s) で乱数を選択する必要があります。

2) (パラメーターの数と比較して) 少量のサンプル トレーニング データからモデルを推定する際のオーバーフィッティングを防ぐには、モデル パラメーターでベイジアン プライオリティを使用します。モデル パラメーターの数 (履歴サイズ) が事前に有限数に固定されていない、この非常に優れた例については、Infinite HMMを参照してください。ベイズ法を使用しない場合は、使用しているトレーニング データの量に応じて履歴の長さを適切に選択するか、アドホックな平滑化 (次数 2 と次数 1 の間の線形補間など) を実装する必要があります。 1モデル)。

于 2009-09-04T22:28:14.757 に答える