我正在与hidden markov models合作。更具体地说,用于过滤和平滑的前向和后向算法。我已经确定了一个表示并且有一个前向fn,它采用隐藏变量和模型的先前概率分布并返回新的概率分布。现在我想要一个过滤函数,它接受一系列传感器状态和一个模型,并返回一个由
组成的序列我已经设法通过递归来实现这一点,但由于它不是尾部位置递归,它会重复出现并且似乎是非惯用的并且通常是一个糟糕的解决方案。我已经尝试将其表述为for,reduce和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)
)
)
)
答案 0 :(得分:1)
递归首先下降到evidence
的末尾并生成(:initial model)
。这是减少的初始值。
然后,递归的每个返回级别将#(forward %1 %2 model)
应用于较低递归级别的应用程序结果(%1
为peek
)和下一个证据元素(作为%2
)。此代码迭代地将两个参数函数应用于序列的连续元素(以相反的顺序采用) - 显然是reduce
的情况。
但是这些结果累积在history
向量中,该向量返回到递归的上层。累积结果的reduce
为reductions
。所以我相信代码的结构大致是这样的:
(reductions #(forward %1 %2 model) (:initial model) (reverse evidence))