2013-02-18 28 views
1

我正在與hidden markov models一起工作。更具體地說,用於濾波和平滑的前向和後向算法。我已經確定了一個表示並且有一個工作進展fn,它將隱含變量和模型的先前概率分佈和返回新的概率分佈。現在我想的濾波函數,它接受傳感器狀態的序列和一個模型,並返回由函數採用順序參數並擁有以前的值

  1. 的初始狀態的序列(包含在模型內)
  2. 使用正向上的前一個狀態中的結果返回序列,下一個傳感器狀態和模型。
  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) 
    ) 
    ) 
) 

回答

1

遞歸第一下降到的evidence結束併產生(:initial model)。這是減少的初始值。

然後遞歸的每個層次返回適用#(forward %1 %2 model)從下遞歸級別的應用程序的結果(如%1,通過peek截取)和證據的下一個元素(如%2)。該代碼迭代地將雙參數函數應用於序列的連續元素(以相反的順序) - 顯然是reduce的情況。

但是這些結果在返回到遞歸上層的history向量中累積。 reduce,累計結果爲reductions。所以我相信代碼的結構大致是這樣的:

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

爲(vector%1)交換%1,它的工作!非常感謝。快速問題:#()宏,相當於匿名(fn [a b])?仍然在Clojure周圍找到我的路,我之前沒有看到它。 – Magos 2013-02-18 21:29:40

+0

@ user1571406是的,它是匿名函數文字的閱讀器宏:http://clojure.org/reader#The%20Reader--Macro%20characters – 2013-02-19 07:52:54

相關問題