函数采用顺序args和自己以前的值

时间:2013-02-18 18:58:03

标签: clojure

我正在与hidden markov models合作。更具体地说,用于过滤和平滑的前向和后向算法。我已经确定了一个表示并且有一个前向fn,它采用隐藏变量和模型的先前概率分布并返回新的概率分布。现在我想要一个过滤函数,它接受一系列传感器状态和一个模型,并返回一个由

组成的序列
  1. 初始状态(包含在模型中)
  2. 在返回序列,下一个传感器状态和模型中使用前一状态的前进结果。
  3. 重复2直到不再有传感器状态。
  4. 我已经设法通过递归来实现这一点,但由于它不是尾部位置递归,它会重复出现并且似乎是非惯用的并且通常是一个糟糕的解决方案。我已经尝试将其表述为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)
          )
        )
      )
    

1 个答案:

答案 0 :(得分:1)

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

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

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

(reductions #(forward %1 %2 model) (:initial model) (reverse evidence))