机器学习之HMM模型

HMM模型

  • 马尔科夫链
  • HMM简介
  • HMM模型基础
  • 前向后向算法评估观察序列概率
  • 维特⽐算法解码隐藏状态序列
  • 鲍姆-⻙尔奇算法简介
  • HMM模型API介绍

马尔科夫链

⻢尔科夫链即为状态空间中从⼀个状态到另⼀个状态转换的随机过程。
在这里插入图片描述该过程要求具备“⽆记忆”的性质: 下⼀状态的概率分布只能由当前状态决定,在时间序列中它前⾯的事件均与之⽆关。这种特定类型的“⽆记忆 性”称作⻢尔可夫性质。
在这里插入图片描述


下图中的⻢尔科夫链是⽤来表示股市模型,共有三种状态:⽜市(Bull market), 熊市(Bear market)和横盘 (Stagnant market)。 每⼀个状态都以⼀定的概率转化到下⼀个状态。⽐如,⽜市以0.025的概率转化到横盘的状态。
在这里插入图片描述
在这里插入图片描述

HMM简介

可见状态链
在这里插入图片描述
隐含状态链
在这里插入图片描述

HMM模型基础

使⽤HMM模型时我们的问题⼀般有这两个特征:
1)我们的问题是基于序列的,⽐如时间序列,或者状态序列。
2)我们的问题中有两类数据:
⼀类序列数据是可以观测到的,即观测序列;
⽽另⼀类数据是不能观察到的,即隐藏状态序列,简称状态序列

HMM模型的定义
在这里插入图片描述
1) ⻬次⻢尔科夫链假设。
在这里插入图片描述

2) 观测独⽴性假设。
![在这里插入图片描述](https://img-blog.csdnimg.cn/28b4df09e30f49b1b89bd4dafef938ce.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATG90dXPCsOOBpA==,size_20,color_FFFFFF,t_70,g_se,x_16

一个HMM模型实例
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

什么样的问题可以⽤HMM模型解决
基于序列的,⽐如时间序列;
问题中包含两类数据,⼀类是可以观测到的观测序列;另⼀类是不能观察到的隐藏状态序列。

HMM模型的两个重要假设
其次⻢尔科夫链假设
观测独⽴性假设

HMM模型的三个基本问题
评估观察序列概率—— 前向后向的概率计算
预测问题,也称为解码问题 ——维特⽐(Viterbi)算法
模型参数学习问题 —— 鲍姆-⻙尔奇(Baum-Welch)算法

前向后向算法评估观察序列概率

在这里插入图片描述

例子
在这里插入图片描述计算
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

维特⽐算法解码隐藏状态序列

论维特⽐算法解码隐藏状态序列,即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应 的隐藏状态序列。

同时维特⽐算法是⼀个通⽤的求序列最短路径的动态规划算法
在这里插入图片描述

计算
 单词 好难记啊,好容易忘记啊

鲍姆-⻙尔奇算法简介

在这里插入图片描述

HMM模型API介绍

API安装

pip install hmmlearn

hmmlearn介绍
在这里插入图片描述实例

import numpy as np
from hmmlearn import hmm

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

# 设定模型参数
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability          # 初始状态分布
model.transmat_=transition_probability      # 状态转移概率分布矩阵
model.emissionprob_=emission_probability    # 观测状态概率矩阵
# 设定观测序列
seen = np.array([[0,1,0]]).T
box = model.predict(seen)
print("球的观测顺序为:\n", ", ".join(map(lambda x: observations[x], seen.flatten()))) # 注意:需要使⽤flatten⽅法,把seen从⼆维变成⼀维
print("最可能的隐藏状态序列为:\n", ", ".join(map(lambda x: states[x], box)))
print(model.score(seen))

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值