我正在使用隐藏的马尔可夫模型做一些工作。更具体地说,用于过滤和平滑的前向和后向算法。我已经确定了一个表示并有一个工作前向 fn,它采用隐藏变量和模型的先前概率分布并返回新的概率分布。现在我想要一个过滤函数,它采用一系列传感器状态和一个模型并返回一个由以下组成的序列
- 初始状态(包含在模型中)
- 对返回序列中的前一个状态、下一个传感器状态和模型使用 forward 的结果。
- 重复 2 直到不再有传感器状态。
我已经设法通过递归来完成这项工作,但由于它不是尾位置递归,它会破坏递归并且看起来不习惯并且通常是一个糟糕的解决方案。我试图将其制定为适用于、减少和迭代,但我似乎无法使它们中的任何一个适合。有什么办法可以改善吗?
(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)
)
)
)