IO流---PrintStream標準位元組輸出流之例項日誌
阿新 • • 發佈:2020-12-29
HMM
馬爾科夫鏈即為
-
狀態空間中從一個狀態到另一個狀態轉換的隨機過程。
-
該過程要求具備
“無記憶”
的性質:
- 下一狀態的概率分佈只能由當前狀態決定,在時間序列中它前面的事件均與之無關
隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知引數的馬爾可夫過程。
-
隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知引數的馬爾可夫過程。
-
常見術語
- 可見狀態鏈
- 隱含狀態鏈
- 轉換概率
- 輸出概率
-
什麼樣的問題可以用HMM模型解決
- 基於序列的,比如時間序列;
- 問題中包含兩類資料,一類是可以觀測到的觀測序列;另一類是不能觀察到的隱藏狀態序列。
-
HMM模型的兩個重要假設
- 其次馬爾科夫鏈假設
- 觀測獨立性假設
-
HMM模型的三個基本問題
- 評估觀察序列概率—— 前向後向的概率計算
- 預測問題,也稱為解碼問題 ——維特比(Viterbi)演算法
- 模型引數學習問題 —— 鮑姆-韋爾奇(Baum-Welch)演算法
-
前向演算法求HMM觀測序列
- 輸入:HMM模型 λ=(A,B,Π),觀測序列
- 輸出:觀測序列概率P(O|λ)
-
- 計算時刻1的各個隱藏狀態前向概率:
-
- 遞推時刻2,3,… …T時刻的前向概率:
-
- 計算最終結果:
-
-
後向演算法求HMM觀測序列
- 輸入:HMM模型 λ=(A,B,Π),觀測序列
- 輸出:觀測序列概率P(O|λ)
- 初始化時刻T的各個隱藏狀態後向概率:
- 遞推時刻T−1,T−2,…1時刻的後向概率:
- 計算最終結果:
- 初始化時刻T的各個隱藏狀態後向概率:
維特比演算法流程總結:
- 輸入:HMM模型 λ=(A,B,Π),觀測序列
- 輸出:最有可能的隱藏狀態序列
流程如下:
- 1)初始化區域性狀態:
-
- 進行動態規劃遞推時刻 t=2,3,…T 時刻的區域性狀態:
-
- 計算時刻T最大的,即為最可能隱藏狀態序列出現的概率。計算時刻T最大的 ,即為時刻T最可能的隱藏狀態。
-
- 利用區域性狀態開始回溯。對於 t=T-1,T-2,…,1
最終得到最有可能的隱藏狀態序列:
MultinomialHMM例項
下面我們用我們在前面講的關於球的那個例子使用MultinomialHMM跑一遍。
import numpy as np from hmmlearn import hmm
# 設定隱藏狀態的集合
states = ["box 1", "box 2", "box3"]
n_states = len(states)
# 設定觀察狀態的集合
observations = ["red", "white"]
n_observations = len(observations)
# 設定初始狀態分佈
start_probability = np.array([0.2, 0.4, 0.4])
# 設定狀態轉移概率分佈矩陣
transition_probability = np.array([
[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]
])
# 設定觀測狀態概率矩陣
emission_probability = np.array([
[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]
])
# 設定模型引數
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability # 初始狀態分佈
model.transmat_=transition_probability # 狀態轉移概率分佈矩陣
model.emissionprob_=emission_probability # 觀測狀態概率矩陣
現在我們來跑一跑HMM問題三維特比演算法的解碼過程,使用和之前一樣的觀測序列來解碼,程式碼如下:
seen = np.array([[0,1,0]]).T # 設定觀測序列
box = model.predict(seen)
print("球的觀測順序為:\n", ", ".join(map(lambda x: observations[x], seen.flatten())))
# 注意:需要使用flatten方法,把seen從二維變成一維
print("最可能的隱藏狀態序列為:\n", ", ".join(map(lambda x: states[x], box)))
我們再來看看求HMM問題一的觀測序列的概率的問題,程式碼如下:
print(model.score(seen))
# 輸出結果是:-2.03854530992
要注意的是score函式返回的是以自然對數為底的對數概率值,我們在HMM問題一中手動計算的結果是未取對數的原始概率是0.13022。對比一下:
import math
math.exp(-2.038545309915233)
# ln0.13022≈−2.0385
# 輸出結果是:0.13021800000000003