問題タブ [markov-models]
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 - データから直接マルコフ モデル図 (makovchain または deemod パッケージ?)
因子データの束を読み取り、そこから遷移行列を作成して、うまく視覚化したいと考えています。「heemod」と呼ばれる非常に優れたパッケージを見つけました。これは、「diagram」と一緒に使用するとうまく機能します。
私の最初の簡単なアプローチでは、Python コードを実行してマトリックスを取得し、この R スニペットを使用してグラフを描画しました。遷移確率は、非公開で重要度の低い Python コードから得られたものですが、私が紙の上で計算したと仮定することもできます。
ただし、すべてを R に統合し、遷移行列とグラフを R 内でシーケンス データから直接生成したいと考えています。
これは私がこれまでに持っているものです:
質問: define_transition が処理できるように、dimMatrix を転送するにはどうすればよいですか?
何か案は?より良い/より簡単な解決策はありますか?
go - golangで加重ランダム選択を実装するエレガントで効率的な方法はありますか? 現在の実装と内部の問題の詳細
tl;dr: golang の配列内の値 (または値の関数) の相対的な大きさに基づいて加重ランダム選択を実装する方法を探しています。このための標準アルゴリズムまたは推奨パッケージはありますか? 彼らはどのようにスケーリングしますか?
目標
golang で 2D および 3D マルコフ処理プログラムを作成しようとしています。そのような単純な 2D の例は次のとおりです。1 つの格子があり、インデックス (i,j) でラベル付けされた各サイトに n(i,j) 個の粒子があるとします。各時間ステップで、プログラムはサイトを選択し、このサイトから 1 つの粒子をランダムな隣接サイトに移動します。サイトが選択される確率は、その時点での人口 n(i,j) に比例します。
現在の実装
L x L ラティスの 2D ケースなど、現在のアルゴリズムは次のとおりです。
- 行を順番に連結して、開始配列を長さ L^2 のスライスに変換します
cdfpop[i L +j]=initialpopulation[i][j]
。 - for loop over を実行して、1D スライスを cdf に変換します
cdfpop[i]+=cdfpop[i-1]
。 - 2 つの乱数を生成します
Rsite
。範囲は 1 から cdf の最大値 (これは最後の値 ですcdfpop[L^2-1]
) で、Rhop
範囲は 1 から 4 です。ホップするランダムな方向に番号を付ける - 二分探索を使用して、より大きいの左端のインデックス
indexhop
を見つけます。ホップ先のインデックスは、x 方向のホップまたはy 方向のホップのいずれかです。cdfpop
Rsite
indexhop +-1
indexhop +- L
cdfpop
最後に、ホップ プロセスを反映するようにの値を直接変更します。cdfpop
これは、順序に応じて、ホップ元 (to) のインデックスとホップ先 (from) のインデックスの間のすべての値から 1 を減算 (1 を加算) することを意味します。- すすぎ、 for ループで繰り返します。最後に累積分布関数を逆にして、最終的な母集団を決定します。
編集: 要求された擬似コードは次のようになります。
このプロセスは、単純な問題に対して非常にうまく機能します。この特定の問題については、現在のセットアップで平均約 2 分で 1000x 1000 格子で約 1 兆ステップを実行できます。また、巨大な関数を使わずに go ルーチンをスピンすることで、10000 程度のステップごとに人口データを GIF にコンパイルできます。徐行。
効率が低下する場所
問題は、サイトの人口に比例しない実数値の係数を持つさまざまなプロセスを追加したいときに発生します。つまり、k_hop *n(i,j) でのホッピング レートと、k_death *(n(i,j))^2 での死亡率 (パーティクルを単純に削除した場合) があるとします。この場合、2 つの速度低下があります。
- 私の cdf は 2 倍のサイズになります (それほど大きな問題ではありません)。それは実際に評価され、
cdfpop[i*L+j]= 4 *k_hop * pop[i][j]
fori*L+j<L*L
とcdfpop[i*L+j]= k_death*math. Power(pop[i][j],2)
forによって作成されL*L<=i*L+j<2*L*L
、その後に が続きcdfpop[i]+=cdfpop[i-1]
ます。次に、cdf の範囲内でランダムな実数を選択します。 - n が 2 乗されているため、各ステップで死亡プロセスの重みに関連付けられた cdf の部分を動的に再計算する必要があります。予想通り、これは大幅な速度低下です。このタイミングは、元のアルゴリズムが 1 ナノ秒未満であったのに比べて、約 3 マイクロ秒です。
この問題は、隣接するサイトの人口の関数としてレートを計算した場合にのみ悪化します。たとえば、自発的な粒子の作成は、隣接するサイトの人口の積に依存します。再計算せずに cdf を修正する方法を真剣に考えて解決したいと思っていますが、複雑さが増す問題をシミュレートしようとしているので、合理的な効率を備えた普遍的な解決策があるかどうか疑問に思わずにはいられません。ランダムなプロセスごとに特別なコードを必要としません。
読んでくれてありがとう!
markov-models - TML(Tractable Markov Logic)は素晴らしいモデルです!人工知能の幅広いアプリケーション シナリオに使用されていないのはなぜですか?
私はマルコフ モデルに関する論文を読んでいましたが、突然 TML (Tractable Markov Logic) のような優れた拡張機能が出てきました。
これはマルコフ論理のサブセットであり、確率論的なクラスとパーツの階層を使用して複雑さを制御します。
このモデルには、複雑な論理構造と不確実性の両方があります。
オブジェクト、クラス、およびオブジェクト間の関係を表すことができますが、TML で構築されたモデルの推論を効率的にクエリできるようにする特定の制限が適用されます。
なぜこのような優れたアイデアが、アクティビティ分析などのアプリケーション シナリオの領域に広まらないのでしょうか?
r - 結果をリストに集計する
すべての状態とそれに対応する時間の列を作成する方法を知りたいです(各リストはIDに対応しています)。Qmatrixは同じままであるため重要ではありません。
私はそれをこの形にしたい: