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