1

私は隠れマルコフモデルでいくつかの作業を行っています。より具体的には、フィルタリングと平滑化のための順方向アルゴリズムと逆方向アルゴリズムです。私は表現に落ち着き、隠し変数とモデルの以前の確率分布を取り、新しい確率分布を返す作業用の fn を持っています。ここで、一連のセンサー状態とモデルを取得し、以下で構成されるシーケンスを返すフィルタリング関数が必要です。

  1. 初期状態 (モデル内に含まれる)
  2. 戻りシーケンスの前の状態、次のセンサー状態、およびモデルで forward を使用した結果。
  3. センサーの状態がなくなるまで 2 を繰り返します。

私は再帰によってこれを機能させることができましたが、それは末尾位置の再帰ではないため、再帰を壊し、慣用的ではなく、一般的に悪い解決策のようです。for、reductions、および iterate で動作するように定式化しようとしましたが、それらのいずれも適合させることができないようです。それを改善する方法はありますか?

(defn filtering
  "Perform filtering to decide the likely state based on evidence.
  Returns a sequence of state probabilities given a sequence of evidence."
  [evidence {:keys [transition sense initial state-map] :as model}]
  (if (empty? evidence)
    (vector initial)
    (let [reading (first evidence)
          history (filtering (drop 1 evidence) model)
          previous-state (vector (peek history)) 
          fwd (forward previous-state reading model) ]
      (conj history fwd)
      )
    )
  )
4

1 に答える 1

1

再帰は最初に の最後まで下がり、evidenceを生成し (:initial model)ます。これは削減の初期値です。

次に、再帰の各戻りレベルは#(forward %1 %2 model)、下位の再帰レベル ( as %1、 によって取得peek) および証拠の次の要素 ( as %2) からのアプリケーションの結果に適用されます。このコードは、2 つの引数の関数をシーケンスの連続する要素に (逆の順序で) 繰り返し適用しreduceます。

しかし、それらの結果はhistory再帰の上位レベルに返されるベクトルに蓄積されます。reduce累計実績ありですreductions。したがって、コードの構造はおおよそ次のとおりだと思います。

(reductions #(forward %1 %2 model) (:initial model) (reverse evidence))
于 2013-02-18T20:40:44.300 に答える