隐马尔可夫

Forward-Backward, Baum Welch, Vierbi

Posted by 新宇 on March 4, 2020

一、HMM简介

1. 马尔可夫链

马尔科夫链即为状态空间中从一个状态到另一个状态转换的随机过程。

1.1 举例

下图中的马尔科夫链是用来表示股市模型,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。 每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。

2. HMM模型介绍

隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。 其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。

2.1 案例

3. HMM模型定义

3.1 一个模型

3.2 两个假设

  • 齐次马尔科夫链假设
    • 即任意时刻的隐藏状态只依赖于它前一个隐藏状态。
  • 观测独立性假设
    • 即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态,这也是一个为了简化模型的假设。

3.3 三个问题

二、算法推导

1. 评估(Forward-Backward)

1.1 前向算法-Forward

1.2 后向算法-Backward

2. 学习(Baum Welch)

3. 解码(Viterbi)

三、案例

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
from hmmlearn import hmm


# In[2]:


# 设定隐藏状态的集合
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]
])


# In[4]:


# 设定模型参数
model = hmm.MultinomialHMM(n_components=n_states)
# 设定初始状态分布
model.startprob_ = start_probability
# 设定状态转移概率矩阵
model.transmat_ = transition_probability
# 设定观测状态概率矩阵
model.emissionprob_ = emission_probability


# In[5]:


# 设定观测序列
seen = np.array([[0, 1, 0]]).T


# In[6]:


seen


# In[10]:


observations


# In[12]:


seen.flatten()


# In[13]:


",".join(map(lambda x: observations[x], seen.flatten()))


# In[14]:


print("球的观测顺序为:\n", ",".join(map(lambda x: observations[x], seen.flatten())))


# In[15]:


# 维特比 - 模型训练
box = model.predict(seen)


# In[16]:


box


# In[17]:


print("盒子最可能的隐藏状态顺序为:\n", ",".join(map(lambda x: states[x], box)))


# In[18]:


# 观测序列的概率的问题
model.score(seen)


# In[19]:


import math

math.exp(-2.038545309915233)


# In[ ]: