机器学习极简入门笔记-4-有监督学习进阶-HMM

news2025/2/28 5:11:51

目录

15.1 基本概念

概率模型

生成模型与判别模型

概率图模型

马尔可夫链,马尔可夫随机场和 CRF

15.2 数学中的HMM

HMM的两个基本假设

15.3 HMM的三个基本问题

概率计算问题

预测问题

学习问题

15.4 HMM3个基本问题的计算

概率计算问题

预测问题

学习问题

15.6 HMM实例


15.1 基本概念

概率模型

所谓概率模型(probabilistic model),顾名思义,就是将学习任务归结于计算变量概率分布的模型

概率模型非常重要。在生活中,我们经常需要根据一些已经观察到的现象来推测和估计未知的东西,这种需求恰恰是概率模型的推断(inference)行为所做的事情。

推断的本质是:利用可观测的变量,推测未知变量的条件分布

本章要讲HMM 和下一章的CRF都是概率模型,之前讲过的朴素贝叶斯和逻辑回归也是概率模型

生成模型与判别模型

概率模型又可以分为两类:生成模型(generative mo odel)和判别模型(discriminative model)。既然概率模型可以通过可观测变量推断部分未知变量,那么我们将可观测变量的集合命名为O,将我们感兴趣的未知变量的集合命名为Y

生成模型学习后得到的是O与Y的联合概率分布P(OY),而判别模型学习后得到的是条件概率分布P(Y|O)

之前我们学过的朴素贝叶斯模型是生成模型,而逻辑回归是判别模型

对于某一个给定的观察值O,运用条件概率P(Y|O)很容易求出它对于不同Y的取值。

那么当遇到分类问题时,直接就可以运用判别模型,判断给定O对于哪一个Y值的条件概率最大,从而来判断该观测样本属于的类别。

使用生成模型直接给观测样本分类有点困难,但也不是不可行,可以运用贝叶斯法则,将生成模型转化为判别模型,但是这样显然比较麻烦。

在分类问题上,判别模型一般更具优势。不过生成模型自有其专门的用途,HMM就是一种生成模型

概率图模型

概率图模型(probabilistic graphical model)是一种以图(graph)为表示工具来表达变量间相关关系的概率模型。

这里说的图就是数据结构中图的概念:一种由节点和连接节点的边组成的数据结构。

在概率图模型中,一般用节点来表示一个或者一组随机变量,而节点之间的边则表示两个(组)变量之间的概率相关关系。

边可以是有向(有方向)的,也可以是无向的。概率图模型大致可以分为下面两类。

  • 有向图模型(贝叶斯网络):用有向无环图表示变量间的依赖关系
  • 无向图模型(马尔可夫网络):用无向图表示变量间的相关关系

HMM 就是贝叶斯网络的一种,虽然它的名字里有“马尔可夫”。对变量序列建模的贝叶斯网络又叫作动态贝叶斯网络。HMM 就是最简单的动态贝叶斯网络

马尔可夫链,马尔可夫随机场和 CRF

马尔可夫链(markovchain)是一个随机过程模型,它表述了一系列可能的事件,在这个系列中,每一个事件的概率仅依赖前一个事件。


15.2 数学中的HMM

HMM是一个关于时序的概率模型,变量分为状态变量观测变量

状态变量和观测变量各自是一个时间序列,每个状态值或观测值都与一个时刻对应,如图所示(箭头表示依赖关系)

一般假定状态序列是隐藏的、不能被观测到的,所以状态变量就是隐变量(hidden variable)。这就是HMM 中H(hidden)的来源。这个隐藏的、不可观测的状态序列是由一个马尔可夫链随机生成的,这是HMM中的第一个M(markov)的含义。

一条隐藏的马尔可夫链随机生成一个不可观测的状态序列(statesequence),然后每个状态又对应生成一个观测结果,这些观测值按照时间顺序排列后就成了观测序列(observation sequence)。状态序列和观测序列一一对应,每个对应的位置又对应着一个时刻。

一般而言,HMM 状态变量的取值是离散的,而观测变量的取值可以是离散的,也可以是连续的。不过为了方便讨论,也因为在大多数应用中观测变量是离散的,我们下面仅讨论状态变量和观测变量都是离散的情况

HMM的两个基本假设

假设1: 齐次马尔可夫假设

假设隐藏的马尔可夫链在任意时刻t的状态只依赖于前一个时刻(t-1)的状态,与其他时刻的状态及观测无关,也与时刻t无关。

用公式表达就是:

假设2:观测独立性假设

假设任意时刻的观测只依赖于该时刻的马尔可夫链状态,与其他观测无关。

用公式表达为:

确定HMM的2个空间和3组参数

所有变量的联合分布为

 


15.3 HMM的三个基本问题

概率计算问题

概率计算问题又称评价(evaluatior)问题。已知信息如下:

  • 模型λ=(A,B,π)
  • 观测序列O=(O1,O2,…,Oт)

求解目标:计算在给定模型λ下,已知观测序列O出现的概率:P(O|λ)。也就是说,给定观测序列,求它和评估模型之间的匹配度。

预测问题

预测问题又称解码问题。已知信息如下:

  • 模型λ=(A,B,π)
  • 观测序列O=(O1,O2,…,Oт)

求解目标:计算在给定模型λ下,使已知观测序列O的条件概率P(O|S)最大的状态序列S=(s1,S2,…,Sт)。即给定观测序列,求最有可能与之对应的状态序列。

学习问题

学习问题又称训练问题。已知信息如下:

  • 观测序列O=(O1,O2,…,Oт)

此时,与O对应的状态序列:S=(s1,S2,…,sт)可能已知,也可能未知。

求解目标:估计模型λ=(A,B,π)参数,使得该模型下观测序列概率 P(O|λ) 最大。也就是训练模型,使其最好地描述观测数据。

前两个问题是模型已经存在之后,如何使用模型的问题,而最后一个是如何通过训练得到模型的问题。


15.4 HMM3个基本问题的计算

概率计算问题

可参考下文

HMM的概率计算问题_Joyliness的博客-CSDN博客_hmm概率计算

预测问题

使用维特比算法

可参考下文

如何通俗地讲解 viterbi 算法? - 知乎

学习问题

HMM 的学习算法根据训练数据的不同,可以分为有监督学习无监督学习

如果训练数据既包括观测序列,又包括对应的状式态序列,且两者之间的对应关系已经明确标注了出来,那么就可以用有监督学习算法。

如果只有观测序列而没有明确对应的状态序列, 就需要用无监督学习算法

可参考

HMM的Baum-Welch算法和Viterbi算法公式推导细节_Orange先生的博客-CSDN博客


15.6 HMM实例

from __future__ import division
import numpy as np

from hmmlearn import hmm


def calculateLikelyHood(model, X):
    score = model.score(np.atleast_2d(X).T)

    print("\n\n[CalculateLikelyHood]: ")
    print("\nobservations:")
    for observation in list(map(lambda x: observations[x], X)):
        print(" ", observation)

    print ("\nlikelyhood:", np.exp(score))

def optimizeStates(model, X):
    Y = model.decode(np.atleast_2d(X).T)
    print("\n\n[OptimizeStates]:")
    print("\nobservations:")
    for observation in list(map(lambda x: observations[x], X)):
        print(" ", observation)

    print("\nstates:")
    for state in list(map(lambda x: states[x], Y[1])):
        print(" ", state)


states = ["Gold", "Silver", "Bronze"]
n_states = len(states)

observations = ["Ruby", "Pearl", "Coral", "Sapphire"]
n_observations = len(observations)

start_probability = np.array([0.3, 0.3, 0.4])

transition_probability = np.array([
        [0.1, 0.5, 0.4],
        [0.4, 0.2, 0.4],
        [0.5, 0.3, 0.2]
])

emission_probability = np.array([
        [0.4, 0.2, 0.2, 0.2],
        [0.25, 0.25, 0.25, 0.25],
        [0.33, 0.33, 0.33, 0]
    ])


model = hmm.MultinomialHMM(n_components=3)

# 直接指定pi: startProbability, A: transmationProbability 和B: emissionProbability
model.startprob_ = start_probability
model.transmat_ = transition_probability
model.emissionprob_ = emission_probability


X1 = [0,1,2]

calculateLikelyHood(model, X1)
optimizeStates(model, X1)

X2 = [0,0,0]

calculateLikelyHood(model, X2)
optimizeStates(model, X2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring源码】18. 属性填充:populateBean()详解

进入populateBean() 对bean的属性进行填充,将各个属性值注入(存在其他bean的属性,则会递归初始化依赖的bean) ​一开始会先对传入的参数进行判断(如下图红框框中的逻辑) 如果传入的BeanWrapper和RootBeanD…

如何免费将pdf转word?看完这篇你就会了

pdf是我们学习工作中,经常会接触到的一种文件格式。通常我们都会以这种pdf格式来传输文件,因为它可以确保在不同的设备上打开以及不会出现文件内容格式错乱的情况。可是当我们需要对它的内容进行修改时,就有些困难,需要先将pdf转换…

软件测试之缺陷书写规范

1、标题:应保持简短、准确、提供缺陷的本质信息。 -尽量以缺陷发生的原因与结果的方式相结合的放式书写; -尽量避免使用模糊不清的词语,例如:“功能中断”、“功能不正确”、“行为不起作用”等,应该使用具体文字说明缺陷的症状; …

flink学习之sql-client之踩坑记录

flink/bin目录下会看到这个脚本,最开始以为是和spark-shell差不多的。结果自行摸索无果,网上查的文章也写的很垃圾,自己查官网看下吧。 SQL 客户端 | Apache Flink 直接./sql-client.sh SELECT Hello World; 报错 org.apache.flink.runtim…

NFT 泡沫是否已经被挤破

Sep. 2022, Dan LeBaron Data Source: Footprint Analytics - NFT Volume in 2021 Vs. 2022 虽然NFT已经存在了几年,但在无聊猿 (BAYC)等大型项目启动的推动下,该技术在2021年爆发式地流行。 似乎是突然间,名人、运动员和主要的艺术收藏家都…

深度剖析 Python 日志重复打印问题

python 日志处理流程 使用 python 做日志输出时,首先我们需要一个创建一个 Logger 对象:import logging; logger logging.getLogger() 然后就可以用 logger.info/debug/error(msg) 来输出日志 如果只是单纯地打印日志,这样做和 print 没有任…

高压功率放大器的作用(功率放大器的应用领域是什么)

高压功率放大器的适用范围和应用领域是很多电子工程师所关心的,那么高压功率放大器的作用以及有哪些使用场景呢,下面就让安泰电子来为大家介绍。 高压功率放大器是电子实验室会频繁使用的测试仪器,是在实验中能够帮助输出信号达到最大输出功率…

【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性-续

大家好,我是黄啊码,上节课的东西学完了吧?脑瓜子嗡嗡的吧?来,继续,让脑瓜子一次性嗡个够,压力大,才有动力。 目录 PHP CSPRNG PHP 7 use 语句 PHP 7 错误处理 PHP intdiv() 函…

实验28:步进电机实验

OK,我是走程序猿的道路 我的blog侧重点在讲解代码 本实验结果: 步进电机正转 步进电机反转 步进电机工作原理我就不去讨论了 重点在于代码分析和讲解 01 硬件电路设计 硬件电路总图 接口: 步进电机驱动器板和Arduino Uno板之间的接线: 步进电机驱动器 Arduino Uno…

opencv之 drawContours() 函数说明应用

drawContours 之前使用mask图还进行了连通域有无status分析,然后才进行的绘制。 今天发现直接使用mask图进行绘制,然后通过设置drawContours的参数可以进行不同层次上缺陷的绘制,然后通过这个事情也说明,有问题可以直接找opencv官…

“综合”web项目编写------手把手0基础教学(一)

我们平常看到的项目代码一般都是分段单独的功能,但如何将功能汇总成一个完整的项目呢,下面我将利用IDEA来介绍一个基础的综合web项目 目录 一.创建项目 二.为项目建包 1.了解构建项目的思路 (1)构建模型(模型包括数…

集线器与交换机、虚拟局域网(3.3)

集线器与交换机 传输门:b站湖科大教书匠 集线器 使用集线器的以太网或者局域网其实本质还是一个总线网 工作方式 集线器只工作在物理层,每个接口仅仅用来转发比特,不进行碰撞检测(不使用CSMA/CD协议),由…

如何自定义代码生成器(上)

1 概述 1.1 介绍 ​ 在项目开发过程中,有很多业务模块的代码是具有一定规律性的,例如controller控制器、service接口、service实现类、mapper接口、model实体类等等,这部分代码可以使用代码生成器生成,我们就可以将更多的时间放…

深度学习中激活函数的用途

深度学习中激活函数的概念 激活函数,即Activation Function,有时候也称作激励函数。它是为了解决线性不可分的问题引出的。但是也不是说线性可分就不能用激活函数,也是可以的。它的目的是为了使数据更好的展现出我们想要的效果。激活函数是一种非线性的…

SAP UI5 SmartTable 控件本地运行时进行 Excel 导出的单步调试

点击 SmartTable 控件生成的表格控件的 Export to Excel 时,遇到如下错误消息: The following error has occurred during export: Unexpected server response: SmartTable 基于的是 OData V4 的模型了: Excel export 操作,触发的…

接口(上)

🐷1.接口的概念 🐱‍🚀2.接口的语法规则 💚3.接口的使用 🚀4.接口的特性 🎆5.实现多个接口 🐶6.接口间的继承 🎊7.接口使用的实例 1.什么是接口呢??&a…

【https】lighttpd增加https支持及openssl生成CA(Certificate Authority)和使用CA来制作签名证书操作说明

环境说明 ubuntu18.04.1、openssl指令需要支持 openssl生成CA(Certificate Authority) 生成RSA Private Key openssl genrsa -out ca.key 输出信息 $ openssl genrsa -out ca.key Generating RSA private key, 2048 bit long modulus (2 primes) ...…

Scala008--Scala中的数据结构【集合】

目录 一,概述 二,set的声明 1,不可变set集合 1)向不可变集合中添加元素 【需要新的set集合接收】 2)对两个set集合进行合并 【需要新的set集合接收】 2,不可变的HashSet集合 2,可变HashSet集合 1&…

http-only原理与防御XSS实践

目录预备知识XSS攻击实验目的实验环境实验步骤一触发XSS漏洞实验步骤二引入Http-only实验步骤三验证http–only在防御XSS攻击时的作用预备知识 XSS攻击 http-only的设计主要是用来防御XSS攻击,所以学习本实验的读者应首先了解XSS攻击的相关原理内容。 跨站点脚本攻…

Vue 2 如何添加 register-service-worker 以实现缓存请求的目的

Vue 2 如何添加 register-service-worker 以实现缓存请求的目的 一、问题描述 现在 vue 3 的模板中是自带 register-service-worker 的。 用这个的好处是,它会自动将项目中的所有文件请求缓存到 service-worker 中,以实现再次打开网站的时候会非常非常…