一、马尔可夫链
- 马尔可夫链是满足马尔可夫性质的随机过程(马尔可夫性质是无记忆性)>>>>这一刻的时刻,受前一时刻的影响,不受更往前时刻状态的影响
- 隐马尔可夫链>>>>隐藏状态序列
二、隐马尔可夫模型
隐马尔可夫模型(Hidden Markov Model)是统计模型,处理的问题具有以下特征:
- 问题基于序列,像时间序列或者状态序列
- 问题中有两类数据,一类序列数据是可以观测到(即观测序列);另一类数据是不能直观观测,即隐藏序列前项能算出后项,观测序列前项不能算出后项
HMM模型的主要参数是λ=(A,B,Π)
Π=(Π1,Π2,…Πn)>>>代表隐藏状态(卖,不动,买)出现在第一个位置的概率
三、举例说明
假如我最近想要买股票,那我怎么去选择股票呢?我只能看到股票的涨跌(预测值),看不到其背后的操作:卖/不动/买(隐藏值),涨跌受背后操作的影响,目前只知道一周之内股票的涨跌,想判断这段时间背后的操作是怎么进行的。目前知道以下信息:
- 观测序列y_hat={o1,o2,…,oT} 一周的涨跌y={1,0,1,1,1}
- HMM模型的主要参数是λ=(A,B,Π)
(1)隐藏状态转移矩阵A
隐藏层从前一个操作到后一操作的转换概率A={{0.5, 0.3, 0.2},{0.2, 0.5, 0.3},{0.3, 0.2, 0.5}}
(2)隐藏状态对观测状态的生成矩阵B(3种->2种)
隐藏层对观察层的影响B={{0.6, 0.3, 0.1},{0.2, 0.3, 0.5}}
(3)隐藏状态的初始概率分布Pi(Π)
背后操作一开始的操作的可能性Pi={0.7, 0.2, 0.1}
代码演示
// An highlighted block
import numpy as np
from hmmlearn import hmm
hiden_num = ["A", "B", "C"]
hiden_num_lenght = len(hiden_num)
observations = ["down","up"]
observations_lenght = len(observations)
p = np.array([0.7, 0.2, 0.1])
a = np.array([
[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]
])
b = np.array([
[0.6, 0.2],
[0.3, 0.3],
[0.1, 0.5]
])
o = np.array([[1, 0, 1, 1, 1]]).T
model = hmm.MultinomialHMM(n_components=observations_lenght)
model.startprob_= p
model.transmat_= a
model.emissionprob_= b
logprob, h = model.decode(o, algorithm="viterbi")
print("The hidden h", ", ".join(map(lambda x: observations[x], h)));
四、HMM具体算法
第一:根据当前的观测序列求解其背后的状态序列,即上示代码中的decode()函数(Viterbi方法)。
第二:根据模型λ=(A,B,Π),求当前观测序列O出现的概率(向前向后算法)
第三:给出几组观测序列O,求模型λ=(A,B,Π)中的参数(Baum-Welch方法)。具体方法是随机初始化模型参数A,B,Π;用样本O计算寻找更合适的参数;更新参数,再用样本拟合参数,直至参数收敛。
五、问题求解步骤
(1)给定主要参数λ=(A,B,Π),求其背后的状态序列(最好的),用维特比算法
说到维特比算法,那就在这里简单介绍一下维特比算法
1到m为隐藏序列z可能的状态
(2)根据模型λ=(A,B,Π),求当前观测序列O出现的概率(向前向后算法)