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)