牛刀小試利使用Python利用維特比算法解決經典隱馬爾科夫鏈問題

PS:折騰了半天終於將博客取回,爲紀念這個歷史時刻,打算將最近學習機器學習的記錄同大家分享下!

以下是解決李航的《統計學習方法》中例10.2(盒子和綵球問題)的Python代碼實現。Csdn對Word文檔編輯的矩陣顯示支持得不太好,算法思路請通過以下鏈接下載查看。

# -*- coding: UTF-8 -*-
"""
   維特比算法實現:解決盒子與球顏色問題
   KaiwiiHo
"""
import numpy as np

if __name__ == '__main__':
    """
    狀態(盒子序號)Q:1,2,3
    觀察值(球的顏色)V:紅,白
    訓練集產生的模型參數(A,B,π)
    """
    stateTransition = np.array([0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5]).reshape(3,3)#狀態間轉移概率矩陣A
    stateToObservationTransition = np.array([0.5,0.5,0.4,0.6,0.7,0.3]).reshape(3,2)#狀態轉移觀察概率矩陣B
    startState = np.array([0.2,0.4,0.4])#狀態初始化概率π
    """
       觀察結果O:"red","white","red",對應序號爲:0,1,0
    """
    observation = np.array([0,1,0])
    """
       迭代計算
    """
    resMaxProbability = []#記錄在當前時刻出現當前觀察值時,出現某狀態的最大概率。
    resMaxState = []#爲出現某狀態的最大概率時,上一時刻的狀態值。
    obs_index = 0
    for obs in observation:
        if obs_index == 0:
            #初始化狀態
            curProbability = startState*stateToObservationTransition[:,observation[obs_index]]
            resMaxProbability.append(curProbability)
        else:
            previewMaxProbability = resMaxProbability[obs_index-1]
            curProbability = []
            curState = []
            for item in range(len(stateTransition)):
                temp = stateTransition[:,item]*previewMaxProbability
                curProbability.append(np.max(temp))
                curState.append(np.argmax(temp))
            curProbability = curProbability*stateToObservationTransition[:,observation[obs_index]]
            resMaxProbability.append(curProbability)
            resMaxState.append(curState)
        obs_index = obs_index + 1
    print(resMaxProbability)
    print("=================")
    print(resMaxState)
    """
    回溯
    """
    resState = []#推理所得的狀態序列
    resMaxProbabilityLen = len(resMaxProbability)
    lastMaxState = np.argmax(resMaxProbability[resMaxProbabilityLen-1])
    resState.append(lastMaxState)
    curMaxProbabilityState = lastMaxState
    print(lastMaxState)
    for index in range(resMaxProbabilityLen-1):
        curMaxProbabilityState = resMaxState[resMaxProbabilityLen-2-index][curMaxProbabilityState]
        resState.append(curMaxProbabilityState)

    print("結果是:%s" % resState)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章