四、NLP学习之HMM

一、马尔可夫链

  • 马尔可夫链是满足马尔可夫性质的随机过程(马尔可夫性质是无记忆性)>>>>这一刻的时刻,受前一时刻的影响,不受更往前时刻状态的影响
  • 隐马尔可夫链>>>>隐藏状态序列

二、隐马尔可夫模型

隐马尔可夫模型(Hidden Markov Model)是统计模型,处理的问题具有以下特征:

  1. 问题基于序列,像时间序列或者状态序列
  2. 问题中有两类数据,一类序列数据是可以观测到(即观测序列);另一类数据是不能直观观测,即隐藏序列前项能算出后项,观测序列前项不能算出后项
    HMM模型的主要参数是λ=(A,B,Π)
    在这里插入图片描述
    Π=(Π1,Π2,…Πn)>>>代表隐藏状态(卖,不动,买)出现在第一个位置的概率

三、举例说明

假如我最近想要买股票,那我怎么去选择股票呢?我只能看到股票的涨跌(预测值),看不到其背后的操作:卖/不动/买(隐藏值),涨跌受背后操作的影响,目前只知道一周之内股票的涨跌,想判断这段时间背后的操作是怎么进行的。目前知道以下信息:

  1. 观测序列y_hat={o1,o2,…,oT} 一周的涨跌y={1,0,1,1,1}
  2. 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出现的概率(向前向后算法)
在这里插入图片描述
在这里插入图片描述

发布了18 篇原创文章 · 获赞 0 · 访问量 143

猜你喜欢

转载自blog.csdn.net/weixin_43979941/article/details/104886718