机器学习 | 揭示EM算法和马尔可夫链的实际应用

news2024/10/5 18:32:44

目录

初识EM算法

马尔可夫链

HMM模型基础

HMM模型使用


初识EM算法

EM算法是一种求解含有隐变量的概率模型参数的迭代算法。该算法通过交替进行两个步骤:E步骤和M步骤,从而不断逼近模型的最优参数值。EM算法也称期望最大化算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔可夫算法(HMM)等等。

EM算法是一种迭代优化策略,由于它的计算方法中每一次迭代都分两步:

其中一个为期望步(E步),另一个为极大步(M步),所以算法被称为EM算法。

EM算法受到缺失思想影响,最初是为了解决数据缺失情况下的参数估计问题,其算法基础和收敛有效性等问题,其基本思想是:

1)首先根据已经给出的观测数据,估计出模型参数的值

2)然后再依据上一步估计出的参数值估计缺失数据的值,再根据估计出的缺失数据加上之前己经观测到的数据重新再对参数值进行估计

3)然后反复迭代,直至最后收敛,迭代结束。

EM算法计算流程如下:

极大似然估计: 极大似然估计是一种常用的统计方法,用于从观测数据中估计概率模型的参数。它的基本思想是寻找在给定观测数据条件下使得概率模型产生观测数据的概率最大的参数值。

假如我们需要调查学校的男生和女生的身高分布,我们抽取100个男生和100个女生,将他们按照性别划分为两组。然后,统计抽样得到100个男生的身高数据和100个女生的身高数据。

我们知道样本所服从的概率分布模型和一些样本,我们需要求解该模型的参数, 

我们已知的条件有两个:

1)样本服从的分布模型  2)随机抽取的样本。

我们需要求解模型的参数,根据已知条件,通过极大似然估计,求出未知参数。

以下是最大似然函数估计值的求解步骤:

马尔可夫链

马尔可夫链(Markov Chain)是一种随机过程,通常用于建模具有“无记忆性”特征的序列数据。在马尔可夫链中,当前状态只取决于前一个状态,而与更早的状态无关。在机器学习算法中,马尔可夫链是个很重要的概念。又称离散时间马尔可夫链,因俄国群学家安德烈·马尔可夫得名。

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

该过程要求具备“无记忆"的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性"称作马尔可夫性质。

马尔可夫链作为实际过程的统计模型具有许多应用,在马尔可夫链的每一步,系统根据概率分布,可以从一个状态变到另一个状态,也可以保持当前状态。态的改变叫做转多,与不同的状态改变相关的概率叫做转移概率。

马尔可夫链的数学表示如下:

某一时刻状态转移的概率只依赖前一个状态,那么只要求出系统中任意两个状态之间的转移概率,这个马尔可夫链的模型就定了。以下是马尔可夫链的经典案例:

HMM模型:隐马尔可夫模型是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。通过以下简单案例来介绍:

其实对于HMM来说,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率,做模拟是相当容易的。但是应用HMM模型时候呢,往往是缺失了一部分信息的。和HMM模型相关的算法主要分为三类,分别解决三种问题:

1)知道般子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种般子(隐含状态链)。

2)还是知道骰子有几种(隐含状态数量),每种般子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率。

3)知道骰子有几种(隐含状态数量),不知道每种般子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想反推出每种般子是什么(转换概率)。

HMM模型基础

HMM模型是基于马尔可夫链的一种概率图模型,广泛应用于语音识别、自然语言处理、生物信息学等领域。与普通的马尔可夫链不同,HMM模型包含两个状态集合:观测状态集合和隐藏状态集合。观测状态表示我们可以直接观察到的状态,隐藏状态则表示我们无法直接观察到的状态。隐藏状态之间仍然满足马尔可夫性质,即当前状态只与前一个状态有关。

HMM模型做了两个很重要的假设如下:

齐次马尔科夫链假设:

观测独立性假设:

什么样的问题需要HMM模型

HMM模型实例:下面我们用一个简单的实例来描述上面抽象出的HMM模型。这是一个盒子与球的模型:

HMM观测序列的生成

HMM模型的三个基本问题

HMM模型使用

有多个库可以用来实现HMM模型,这里我就拿常用的hmmlearn库进行举例,hmmlearn是一个基于scikit-learn的Python库,提供了多种HMM模型及其变体的实现。它支持高斯混合模型和多项式分布模型,可以用于多个领域的序列学习问题。以下是其安装命令,终端执行如下命令安装:

pip install hmmlearn -i https://pypi.mirrors.ustc.edu.cn/simple

hmmlearn实现了三种HMM模型类,按照观测状态是连续状态还是离散状态,可以分为两类。

GaussianHMM和GMMHMM是连续观测状态的HMM模型,而MultinomiaIHMM是离散观测状态的模型,也是我们在HMM原理系列篇里面使用的模型。在这里主要介绍我们前面一直讲的关于离散状态的MultinomialHMM模型。对于MultinomialHMM的模型,使用比较简单:

1)tartprob_"参数对应我们的隐藏状态初始分布Ⅱ。

2)transmat_"对应我们的状态转移矩阵A。

3)emissionprob_"对应我们的观测状态概率矩阵B。

以下是使用HMM模型的基础案例讲解:

# 导入相应模块
import numpy as np
from hmmlearn import hmm

下面这段代码是一个使用隐马尔可夫模型进行建模的示例,这些参数的设定是HMM模型的基础,它们描述了隐藏状态和观测状态之间的关系。在实际应用中,你可以根据具体问题来设定这些参数,然后使用HMM模型进行概率计算、状态预测等任务:

# 设定隐藏状态的集合
states = ["box 1", "box 2", "box 3"]
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]])

下面这段代码是使用hmmlearn库中的CategoricalHMM模型来进行隐马尔可夫模型建模的示例,利用这个已经初始化好的模型对象进行概率计算、状态预测等任务。这里的CategoricalHMM模型是用于处理离散观测状态的情况,如果观测状态是连续值,可以考虑使用GaussianHMM模型:

# 定义模型
model = hmm.CategoricalHMM(n_components=n_states)

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

对于 HMM 问题三:维特比算法的解码过程,使用和之前一样的观测序列来解码:

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

print("球的观测顺序为:", ' → '.join(map(lambda x: observations[x], seen.flatten())))
# 注意:需要使用flatten方法,把seen从二维变成一维
print("最可能的隐藏状态序列为:", ' → '.join(map(lambda x: states[x], box)))

得到的结果如下所示:

如果求 HMM 问题一的观测序列的概率的问题,代码如下: 

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

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

相关文章

C++进阶(十二)lambda可变参数包装器

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、新的类功能1、默认成员函数2、类成员变量初始化3、 强制生成默认函数的关键字default:4、…

拿捏循环链表

目录: 一:单链表(不带头单向不循环)与循环链表(带头双向循环)区别 二:循环链表初始化 三:循环链表头插 四:循环链表尾插 五:循环链表头删 六&#xff1…

【leetcode】深搜、暴搜、回溯、剪枝(C++)1

深搜、暴搜、回溯、剪枝(C)1 一、全排列1、题目描述2、代码3、解析 二、子集1、题目描述2、代码3、解析 三、找出所有子集的异或总和再求和1、题目描述2、代码3、解析 四、全排列II1、题目解析2、代码3、解析 五、电话号码的字母组合1、题目描述2、代码3…

华为 Huawei 交换机 黑洞MAC地址的作用和配置示例

黑洞mac作用:某交换机上配置某个PC的mac地址为黑洞mac,那么这台PC发出来的包都会被交换机丢弃,不会被转发到网络中。 组网需求: 如 图 2-13 所示,交换机 Switch 收到一个非法用户的访问,非法用户的 MAC 地址…

Java实现民宿预定管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

幻兽帕鲁官方服务器不稳定怎么办?5秒钟自建幻兽帕鲁服务器

幻兽帕鲁太火了,官方palworld服务器不稳定?不如自建服务器,基于腾讯云幻兽帕鲁服务器成本32元全自动部署幻兽帕鲁服务器,超简单有手就行,全程自动化一键部署10秒钟即可搞定,无需玩家手动部署幻兽帕鲁游戏程…

时光峰峦文物璀璨,预防性保护筑安全

在璀璨的历史长河中,珍贵文物如同时间的印记,承载着过往的辉煌。《人文山水时光峰峦——多彩贵州历史文化展》便是这样一场文化的盛宴,汇聚了众多首次露面的宝藏。然而,文物的保存对环境要求极为苛刻,温湿度波动都可能…

十六、Vben框架table内部合并行

在vben项目中合并内部的行是一个常规的操作,以前我们说过如果是一条数据内部只需要分割拿高撑开就可以实现,在第三章的时候我们已经讲过了,那么如果是不定的条数合并为一条数据呢,怎么能够实现呢,下面我们就来讲讲。 先看效果图 如图,能看到是三条数据,其实是…

用keytool 生成JWT的RSA非对称密钥

写在前面 JWT 令牌 可以由 X.509 证书或 256 位非对称密钥签名来充当,为了获得合法的JWT 令牌,我们可以使用JDK中的keytool.exe工具来生成。 本例的操作环境是Windows系统,操作的前置条件需要先安装好JDK,并配置好环境变量&…

Unity类银河恶魔城学习记录4-4 4-5 P57-58 On Hit Impactp- Attack‘direction fix源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic;…

计算机视觉讲座PPT分享

最近在电子工业出版社做的《计算机视觉入门路线图》讲座的部分PPT。 主要介绍了计算机视觉的学习基本路线。

yolov8使用旋转框自己做数据集检测

主要在数据集制作,训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具,这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件,然后把dota的xml文件转换成dota的txt文件…

如何决定K8S Pod的剔除优先级

在Kubernetes(k8s)中,当节点资源面临压力时,如何决定Pod的优先级是一个关键问题。在Kubernetes 1.8版本之后,引入了基于Pod优先级的调度策略,即Pod Priority Preemption。这种策略允许在资源不足的情况下&a…

docker部署docker运维工具

简介 主要功能:管理容器,管理镜像,管理容器网络 安装 拉取镜像 docker pull joinsunsoft/docker.ui:1.0.1 启动容器 docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 10039:8999 joinsunsoft/docker.ui:1.0.1 使用 打…

Swift Combine 从入门到精通一

1. Combine 简介 用 Apple 官方的话来说,Combine 是: a declarative Swift API for processing values over time. Combine 是 Apple 用来实现函数响应式编程的库, 类似于 RxSwift。 RxSwift 是 ReactiveX 对 Swift 语言的实现。 Combine 使用了许多可以…

泰克示波器——TBS2000系列界面整体介绍

目录 1.1 通道区域面板标识1.2 示波器测试输出(检测探针与设置的好坏)1.3 面板其他快捷按钮1.4 波器整体界面 1.1 通道区域面板标识 在通道面板的下方标识有示波器的通道属性以及参数值,如我使用的型号为“TBS2104X”的示波器,面…

Spring速成(三)

文章目录 Spring速成(三)1,AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2,AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点…

中科大计网学习记录笔记(六):应用层概述 | 应用层原理

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

基于SSM的餐厅点菜管理系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的餐厅点菜管理系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring …

作业2.7

一、填空题 1、在下列程序的空格处填上适当的字句&#xff0c;使输出为&#xff1a;0&#xff0c;2&#xff0c;10。 #include <iostream> #include <math.h> class Magic {double x; public: Magic(double d0.00):x(fabs(d)) {} Magic operator(__const Magic&…