隐马尔可夫模型的定义
隐马尔可夫模型(Hidden Markov Model, HMM)是一种时序概率模型,它描述了一个由不可见状态序列(state sequence)所驱动的过程。这些隐藏的状态由一个马尔可夫链随机生成,并且每个状态都对应着一个观测结果。这样,每个状态不仅代表了系统在某一时刻的内在特性,而且决定了在那个时刻可以观测到的随机序列(observation sequence)。
HMM的三要素
组成三要素
初始概率分布:
状态转移概率分布:A
观测概率分布:B
𝑸 = {𝒒𝟏, 𝒒𝟐, … , 𝒒𝑵 }:所有可能状态的集合
𝑽 = {𝒗𝟏, 𝒗𝟐, … , 𝒗𝑴} :所有可能观测的集合
𝑰 = (𝒊𝟏, 𝒊𝟐, … , 𝒊𝑻): 长度为T的状态序列
𝑶 = (𝒐𝟏, 𝒐𝟐, … , 𝒐𝑻): 对应的观测序列
三个基本问题
1. 概率计算问题
给定模型和观测序列,计算观测序列出现的概率。这可以通过前向算法(Forward Algorithm)或后向算法(Backward Algorithm)来解决。
-
前向算法:用于计算到时刻 tt 的所有可能的隐含状态序列的概率。
Code
def HMM_forward(A,B,Pi,T):
Pi_cur = Pi
t = 1
for j in T:
alpha = Pi_cur*B[:,j]
if t < len(T)
for i in range(len(Pi)):
Pi_cur[i] = np.dot(A[:,i],alpha)
t += 1
print(alpha)_
prob = np.sum(alpha)
return prob
-
后向算法:与前向算法类似,但计算的是时刻 tt 之后到达每个状态的概率。
Code
def HMM_backward(A,B,Pi,T):
n=len(T)
beta_cur = np.ones(n)
for j in range(n):
if j < n-1:
beta = beta_cur
for i in range(n):
beta_cur = np.dot(A,beta*B[:,T[n-j-1]])
print(beta_cur)
prob = np.dot(beta_cur,Pi*B[:,T[0]])
return prob
2. 参数估计问题
已知观测序列,估计模型参数(状态转移概率、观测概率、初始状态概率)。这通常通过Baum-Welch算法,一种基于EM算法的特例来实现。
- Baum-Welch算法:迭代地调整模型参数,直到收敛到局部最优解。
3. 预测算法或解码问题
给定模型和观测序列,找到最可能的隐含状态序列。这通常通过Viterbi算法来解决。
- Viterbi算法:动态规划算法,用于寻找最可能的隐含状态路径。
隐马尔可夫模型课后习题——李航
第一题:
解题过程如下:
第二题:
解题过程如下:
第三题:
解题过程如下: