先舉個例子來解釋
已知情況:(假如模型已經學出這些引數概率)
隱含的身體狀態 =根據viterbi理論,後一天的狀態會依賴與前一天的狀態和當前的觀測狀態。那麼只要根據第一天的正常狀態一次推算,找出到達第三天頭暈狀態的最大的概率,就可以知道這三天的身體變化狀態。可觀察的感覺狀態 =
月兒預判的阿驢身體狀態的概率分布 =
月兒認為的阿驢身體健康狀態的轉換概率分布 =
健康發燒
健康0.7
0.4發燒
0.30.6
月兒認為的在相應健康狀況條件下,阿驢的感覺的概率分布 =
健康發燒
正常0.5
0.1冷
0.40.3
頭暈0.1
0.6
阿驢連續三天的身體感覺依次是: 正常、冷、頭暈 (即觀測)。
p(健康)=0.6,p(發燒)=0.4
計算第一天身體「正常」情況下最有可能的身體狀態p(健康)=p(正常|健康) x p(健康|初始) =0.5x0.6=0.3
p(發燒)=p(正常|發燒) x p(發燒|初始) =0.1x0.4=0.04
那麼第一天最有可能的身體狀態是:健康
計算第二天 「冷」 情況下最有可能的身體狀態p(健康)=p(冷|健康) x max = 0.4 x max(0.3*0.7 , 0.04*0.4)=0.084
p(發燒)=p(冷|發燒) x max = 0.3 x max(0.3*0.3 , 0.04*0.6)=0.024
所以第二天最有可能的身體狀態是:健康
計算第三天 「頭暈」 情況下最有可能的身體狀態p(健康)=p(頭暈|健康) x max = 0.1 x max(0.084*0.7 , 0.027*0.4)=0.00588
p(發燒)=p(頭暈|發燒) x max = 0.6 x max(0.084*0.3 , 0.027*0.6)=0.01512
所以第二天最有可能的身體狀態是:發燒
所以最終的身體狀態變化序列為:健康---健康---發燒回溯:
這兒的箭頭指向就是乙個回溯查詢小本本的過程,我們在編寫演算法的時候,其實也得注意,每乙個概率最大的單條路徑上都要把前乙個狀態記錄下來。
最終的**如下:
分步:
最後講一下beam search和viterbi的區別:
# five elements for hmm
states = ('healthy', 'fever')
observations = ('normal', 'cold', 'dizzy')
start_probability =
transition_probability = ,
'fever' : ,
}emission_probability = ,
'fever' : ,
}def viterbit(obs, states, s_pro, t_pro, e_pro):
path = # init path: path[s] represents the path ends with s
curr_pro = {}
for s in states:
curr_pro[s] = s_pro[s]*e_pro[s][obs[0]]
for i in xrange(1, len(obs)):
last_pro = curr_pro
curr_pro = {}
for curr_state in states:
max_pro, last_sta = max(((last_pro[last_state]*t_pro[last_state][curr_state]*e_pro[curr_state][obs[i]], last_state)
for last_state in states))
curr_pro[curr_state] = max_pro
# find the final largest probability
max_pro = -1
max_path = none
for s in states:
if curr_pro[s] > max_pro:
max_path = path[s]
max_pro = curr_pro[s]
# print '%s: %s'%(curr_pro[s], path[s]) # different path and their probability
return max_path
if __name__ == '__main__':
obs = ['normal', 'cold', 'dizzy']
print viterbit(obs, states, start_probability, transition_probability, emission_probability)
維特比演算法(Viterbi)
import numpy as np state transfer np.array 0.5,0.2,0.3 0.3,0.5,0.2 0.2,0.3,0.5 狀態轉移矩陣 observe prob np.array 0.5,0.5 0.4,0.6 0.7,0.3 觀測概率矩陣 initial np....
維特比演算法(Viterbi)
編輯 維特比演算法是一種 動態規劃演算法用於尋找最有可能產生觀測事件序列的 維特比路徑 隱含狀態序列,特別是在馬爾可夫資訊源上下文和隱馬爾可夫模型中。術語 維特比路徑 和 維特比演算法 也被用於尋找觀察結果最有可能解釋相關的動態規劃演算法。例如在統計句法分析中動態規劃演算法可以被用於發現最可能的上下...
簡單理解viterbi 維特比演算法
viterbi演算法其實就是多步驟每步多選擇模型的最優選擇問題,其在每一步的所有選擇都儲存了前續所有步驟到當前步驟當前選擇的最小總代價 或者最大價值 以及當前代價的情況下前繼步驟的選擇。依次計算完所有步驟後,通過回溯的方法找到最優選擇路徑。符合這個模型的都可以用viterbi演算法解決。隱含的身體狀...