隱馬爾可夫模型(hidden markov model,hmm)是可用於標註問題的統計學習模型,描述隱藏的馬爾科夫鏈隨機生成觀測序列的過程,屬於生成模型。由初始狀態概率向量π、狀態轉移概率矩陣a和觀測概率矩陣b決定的隱馬爾可夫模型λ=(a,b,π)的3個基本問題,分別為:
1.概率計算問題,在給定模型和觀測序列,求該模型下序列出現的概率;
2.學習問題,給定觀測序列去求模型λ=(a,b,π)的引數,使得該模型下給定觀測序列概率最大;
3.**問題,已知模型λ=(a,b,π)和觀測序列,求最有可能對應的狀態序列。
對於問題1,常見的有前向演算法及後向演算法,問題2的常見方法有監督學習方法和baum-welch演算法(由em演算法推導得出),問題3的常見演算法有近似演算法和維特比演算法。
這裡通過**大致解釋一下思路:
前向演算法:
import numpy as np
#前向演算法
defforwardprobcal
(datatransprob,dataobsprob,datainitprob,oblist)
: mata = np.mat(datatransprob)
matb = np.mat(dataobsprob)
vecpi = np.mat(datainitprob)
.t m,n = np.shape(matb)
t =len(oblist)
#用於計算每個狀態下的前向概率
mataccum = np.zeros(
(m,t)
)#初始化
mataccum[:,
0]= np.multiply(vecpi,matb[
:,oblist[0]
].a)
.t #遞推計算
for i in
range(1
,t):
for j in
range(0
,m):
prob = mataccum[
:,i -1]
* mata[
:,j]
mataccum[j,i]
= prob * matb[j,oblist[i]
]print
(mataccum)
resprob = mataccum[:,
-1].
sum(
)return resprob,mataccum
第一項為所得的觀測概率,第二項為時序的前向概率矩陣。
以書上例10.2的資料為例,代入:
dataa =[[
0.5,
0.2,
0.3],[
0.3,
0.5,
0.2],[
0.2,
0.3,
0.5]
]datab =[[
0.5,
0.5],[
0.4,
0.6],[
0.7,
0.3]
]vecpi =
[0.2
,0.4
,0.4
]oblist =[0
,1,0
]resprob = forwardprobcal(dataa,datab,vecpi,oblist)
print
(resprob[0]
)
#後向演算法
defbackwardprobcal
(datatransprob,dataobsprob,datainitprob,oblist)
: mata = np.mat(datatransprob)
matb = np.mat(dataobsprob)
vecpi = np.mat(datainitprob)
.t m,n = np.shape(matb)
t =len(oblist)
#用於計算每個狀態下的後向概率
mataccum = np.zeros(
(m,t)
)#初始化
mataccum[:,
-1]=
1for i in
range
(t-2,-
1,-1
):for j in
range(0
,m):
mataccum[j,i]
= np.multiply(np.multiply(mata[j,:]
.t, matb[
:,oblist[i +1]
]),np.mat(mataccum[
:,i +1]
).t)
.sum()
print
(mataccum)
resprob = np.multiply(np.multiply(vecpi,matb[
:,oblist[0]
]),np.mat(mataccum[:,
0]).t)
.sum()
return resprob,mataccum
第一項為所得的觀測概率,第二項為時序的後向概率矩陣。
用上面的資料測試,可以獲得與前向演算法一致的結果。
對於書上習題10.1,可以使用上面的後向演算法得到結果(當然前向演算法結果也一樣),對於習題10.2,可以使用上面的兩個演算法各自得出前向概率矩陣及後向概率矩陣後使用np.multiply得到前向後向概率矩陣,再以第3個狀態之和除以概率總和值(使用.sum(axis = 1))即可。
下面關於維特比演算法的簡單實現:
#維特比演算法
defviterbi
(datatransprob,dataobsprob,datainitprob,oblist)
: mata = np.mat(datatransprob)
matb = np.mat(dataobsprob)
vecpi = np.mat(datainitprob)
.t m,n = np.shape(matb)
t =len(oblist)
matprobcal = np.zeros(
(m,t)
) matroute = np.zeros(
(m,t)
)#初始化
matprobcal[:,
0]= np.multiply(vecpi,matb[
:,oblist[0]
]).t matroute[:,
0]= np.mat(
list
(range(1
,m +1)
))for i in
range(1
,t):
for j in
range(0
,m):
#計算概率
probcal = np.multiply(np.mat(matprobcal[
:,i -1]
).t,mata[
:,j]
) matprobcal[j,i]
= np.
max(probcal)
* matb[j,oblist[i]
] matroute[j,i]
= np.argmax(probcal)+1
return matprobcal,matroute
使用書上的例10.3的資料,可以獲得對應的概率矩陣和路徑矩陣
[[0.1 0.028 0.00756]
[0.16 0.0504 0.01008]
[0.28 0.042 0.0147 ]]
[[1. 3. 2.]
[2. 3. 2.]
[3. 3. 3.]]
AI 統計學習(18) 隱馬爾可夫和條件隨機場
隱馬爾可夫和條件隨機場 應用於語音識別 自然語言處理等應用。簡單的說我們就是用圖,有向圖 無向圖來表示離散的變數和其概率分布。解決的是標註問題,關注的是變數之間的 依賴性 獨立性 1.團 最大團 2.有向圖無向圖 3.馬爾可夫性 4.隱馬爾可夫模型 2個假設,3個基本問題,3組引數 5.條件隨機場圖...
讀書筆記 統計學 從資料到結論 第十章
第十章 主成分分析和因子分析 當變數很多,且有些變數是相關的時候,為了找出少數能夠代表它們的變數,就要用到主成分分析和因子分析,所以,主成分分析和因子分析都是用來降維的。假定原先資料是二維觀測值,在乙個二維座標系中,這些資料點形成乙個有橢圓形輪廓的點陣,這個橢圓有兩條軸,一條長軸和一條短軸,互相垂直...
演算法競賽入門經典第十章學習筆記 大整數取模 冪取模
10 1 大整數取模 題目 輸入整整數n和m,輸出n mod m的值。n 1 0100,m 109 n leq 10 m leq 10 9 n 1010 0,m 109。這道題的特別之處在於n的範圍很大,無法用整型變數儲存和直接計算。大整數n用兩個字串儲存,m可以用整型儲存。我們可以將n的每位數字分...