2012-06-12 55 views
1

我正在研究一個需要使用隱馬爾可夫模型的項目。我下載了凱文墨菲的工具箱。我對使用有一些問題。在工具箱網頁中,他說dhmm_em和dhmm_logprob的第一個輸入是符號序列數據。在他們的例子中,他們給行向量作爲數據。所以,當我將我的符號序列作爲行向量時,我會得到錯誤;kevin murphy的嗯matlab工具箱斷言錯誤

??? Error using ==> assert at 9 
assertion violated: 

Error in ==> fwdback at 105 
assert(approxeq(sum(alpha(:,t)),1)) 

Error in ==> dhmm_logprob at 17 
    [alpha, beta, gamma, ll] = fwdback(prior, 
    transmat, obslik, 'fwd_only', 1); 

Error in ==> mainCourseProject at 110 
      loglik(train_act) = 
      dhmm_logprob(orderedSymbols, 
      hmm{train_act}.prior, 
      hmm{train_act}.trans, 
      hmm{act}.emiss); 

但是,在給出這個錯誤之前,代碼適用於某些符號向量。當我將數據作爲列向量提供時,函數可以正常工作,沒有錯誤。那麼,爲什麼我會得到這個錯誤?你可能會說我應該給不是單個向量,而是向量集,我也試圖在一個結構中收集我的特徵向量並給出行向量,但是沒有任何變化,我仍然斷言錯誤。順便說一下,我的符號序列沒有任何零,我所做的一切幾乎與他們的例子中所顯示的一樣,所以如果有人能夠幫助我,我會非常感激。

回答

2

林不知道,但從上面顯示的函數調用堆棧,不應該最後一行是hmm{train_act}.emiss而不是hmm{act}.emiss。換句話說,當你計算一個序列的對數概率時,你應該通過屬於同一個HMM模型(轉移矩陣,發射矩陣和先驗概率)的分量。

順便說一下,代碼中的ASSERT是一種理智檢查,概率向量應該總和爲1。通常情況下,當使用非常小的值(對數概率)時,數值穩定性問題可能會蔓延......您可以編輯APPROXEQ函數以稍微放寬比較,給它一個更大的誤差範圍

1

此錯誤消息及其引用的代碼是人類可讀的。斷言是程序員投入的後衛,以確保滿足某些條件。在這種情況下,條件是什麼? approxeq(sum(alpha(:,t)),1)我敢說,近似值想要的值大致相等,所以這可歸結爲:sum(alpha(:,t)) ~= 1

不知道代碼的任何事情,我也猜測這些指的是概率。節點邊緣的概率必須總和爲1。希望這會啓動您一條高效的調試路徑。如果你無法弄清楚產生這種情況的輸入有什麼問題,那麼開始在代碼中涉入一點,看看這個alpha向量來自哪裏,以及它如何最終失效。