1

我正在使用隐藏的马尔可夫模型做一些工作。更具体地说,用于过滤和平滑的前向和后向算法。我已经确定了一个表示并有一个工作前向 fn,它采用隐藏变量和模型的先前概率分布并返回新的概率分布。现在我想要一个过滤函数,它采用一系列传感器状态和一个模型并返回一个由以下组成的序列

  1. 初始状态(包含在模型中)
  2. 对返回序列中的前一个状态、下一个传感器状态和模型使用 forward 的结果。
  3. 重复 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)
      )
    )
  )
4

1 回答 1

1

递归首先下降到末尾evidence并产生 (:initial model). 这是减少的初始值。

然后递归的每个返回级别适用#(forward %1 %2 model)于来自较低递归级别(as %1,采用peek)和证据的下一个元素(as %2)的应用程序结果。此代码迭代地将两个参数函数应用于序列的连续元素(以相反的顺序获取) - 显然是reduce.

但是这些结果会累积在history返回到上层递归的向量中。reduce与累积的结果是reductions。所以我相信代码的结构大致是这样的:

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