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

目录

初识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.mzph.cn/news/673143.shtml

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

相关文章

H12-821_28

28.如图所示,在一个纯IPv6环境中,若想实现PC1与PC2之间的通信,下列哪组地址可以分别配置在PC1与P2上 A.2001:FDC:1/64 2001:FDC::2/64 B.2001:FDC::1/64 2001:FDC1::2/64 C.FD00:1AC0:872E::1/64 FD00:2BE1:2320::1/64 D.FE80::1/64 FE80::2/64 答案:B 注释&…

Termux配置安卓编译环境

前言 Termux安装后,就相当于把手机变成了一台Linux服务器,而且现在手机卡通常是能拿到ipv6公网地址的,所以,这个服务器能干啥? 编程搭建网站跑脚本 本文讲述的就是怎么在Termux搭建安卓编译环境,实现手机…

c++之说_12|模板

关于模板&#xff0c;至少我们要先了解几个概念 一&#xff1a;函数模板 二&#xff1a;类模板 三&#xff1a;模板特化 四&#xff1a;形参参数包 模板覆盖的东西太多 我目前也不了解太多 函数模板 语法 template<typename 类型名,typename 类型名,typename ...多参…

CopyOnWriteArrayList底层原理全面解析【建议收藏】

简介 CopyOnWriteArrayList是Java中的一个线程安全的集合类&#xff0c;是ArrayList线程安全版本&#xff0c;主要通过Copy-On-Write&#xff08;写时复制&#xff0c;简称COW&#xff09;机制来保证线程安全。 Copy-On-Write机制核心思想&#xff1a;向一个数组中添加数据时…

LabVIEW动平衡测试与振动分析系统

LabVIEW动平衡测试与振动分析系统 介绍了利用LabVIEW软件和虚拟仪器技术开发一个动平衡测试与振动分析系统。该系统旨在提高旋转机械设备的测试精度和可靠性&#xff0c;通过精确测量和分析设备的振动数据&#xff0c;以识别和校正不平衡问题&#xff0c;从而保证机械设备的高…

Springboot集成jasypt实现配置文件加密

Jasypt它提供了单密钥对称加密和非对称加密两种加密方式。 单密钥对称加密&#xff1a;一个密钥加盐&#xff0c;可以同时用作内容的加密和解密依据&#xff1b; 非对称加密&#xff1a;使用公钥和私钥两个密钥&#xff0c;才可以对内容加密和解密&#xff1b; 我们以单密钥对称…

前端 reduce()用法总结

定义 reduce()方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行)&#xff0c;将其结果汇总为单个返回值。语法为&#xff1a; array.reduce(function(accumulator, currentValue, currentIndex, arr), initialValue); /*accumulator: 必需。累计器currentValu…

5 步轻松上手,教你从 0 到 1 落地 Jmeter 接口自动化脚本!

Jmeter是进行接口测试的一款非常主流的工具&#xff0c;但绝大部分测试工程师&#xff0c;对于Jmeter接口测试脚本整理都是一知半解的。今天这篇文章&#xff0c;就以一个金融项目中接口为例&#xff0c;通过简单5步&#xff0c;教大家如何0代码编写Jmeter接口自动化脚本&#…

CPU和GPU有什么区别,玩游戏哪个更重要?

大家好&#xff01;今天我们要聊的话题是CPU和GPU&#xff0c;它们在电脑中扮演着重要的角色&#xff0c;虽然看起来只是两个简单的缩写&#xff0c;但它们的功能和影响是截然不同的&#xff01; 那么&#xff0c;究竟CPU和GPU有什么区别呢&#xff1f;在玩游戏时&#xff0c;…

Linux 系统开启网络服务

首先&#xff0c;大家新装的linux系统可能都没有安装vim工具&#xff0c;所以打开文件的方式是 vi /etc/sysconfig/network-scripts/ifcfg-ens33在这个界面把onboot改为yes&#xff0c;我这里是设置完的。然后通过下面语句重新启动服务就可以了。 service network restartcen…

2024.2.7日总结(小程序开发4)

页面导航 页面导航是页面之间的相互跳转&#xff1a; <a>链接location.href 小程序中实现页面导航的两种方式&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转 编程式导航 调用小程序的导航API&…

飞天使-k8s知识点15-kubernetes散装知识点4-CNI网络插件与kubectl

文章目录 CNI 网络插件安装任意节点运行kubectlAPI的版本区别与废弃API查询 CNI 网络插件安装 这里将以 Calico 为例&#xff0c;提供在 Kubernetes 1.20.6 版本上安装 CNI 插件的步骤。请注意&#xff0c;具体的步骤可能会因 CNI 插件的类型和你的特定环境而略有不同。设置 Ku…

BaseMapper中提供的方法(17种CRUD)

BaseMapper封装的17种增删改查方法 MybatisPlus框架中mapper层继承了BaseMapper接口&#xff0c;该接口中封装了常用的增删改查方法&#xff0c;共有17种&#xff0c;以下是方法的详情介绍 首先需要明确的括号内的一些对象定义 泛型T&#xff1a;实体类类型Param注解&#x…

iPhone解锁 AnyMP4 iPhone Unlocker

AnyMP4 iPhone Unlocker是一款功能强大的iPhone解锁软件&#xff0c;旨在帮助用户轻松解决iPhone密码忘记、设备锁定等问题。无论是屏幕密码、指纹解锁还是Face ID&#xff0c;该软件都能提供有效的解决方案。 这款软件支持多种iPhone型号&#xff0c;包括最新的iPhone 14系列…

2.3_9 吸烟者问题

2.3_9 吸烟者问题 问题描述 问题分析 假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它&#xff0c;但是要卷起并抽掉一支烟&#xff0c;抽烟者需要有三种材料&#xff1a;烟草、纸和胶水。三个抽烟者中&#xff0c;第一个拥有烟草、第二个拥有纸…

泛娱乐社交出海洞察,Flat Ads解锁海外增长新思路

摘要:解读泛娱乐社交应用出海现状与趋势,解锁“掘金”泛娱乐社交出海赛道新思路。 根据全球舆情监测机构 Meltwater 和社交媒体机构We are Social最新发布数据显示,全球社交媒体活跃用户数量已突破50亿,约占世界人口总数62.5%。庞大的用户数量意味着广阔的增量空间,目前,随着全…

使用HCPpipelines分割皮层

前段时间阅读了一篇文献,文章的做法我比较感兴趣,所以打算学习一下文献的做法。文章的最开始一部分是使用HCPpipelines对T1和T2像进行皮层分割,调用的是freesurfer6。https://github.com/Washington-University/HCPpipelines 一、工作环境准备 1.安装好FSL,版本在6.0.2以上…

Linux环境下配置HTTP代理服务器教程

大家好&#xff0c;我是你们可爱的Linux小助手&#xff01;今天&#xff0c;我将带你们一起探索如何在Linux环境下配置一个HTTP代理服务器。请注意&#xff0c;这不是一次火箭科学的实验&#xff0c;而是一次简单而有趣的冒险。 首先&#xff0c;我们需要明确什么是HTTP代理服…

Unity AnimationRigging无法修改权重?

个人理解&#xff0c;已解决无法修改权重的问题: unity自带的动画系统是在FixUpdate和Update之后LateUpdate之前执行&#xff0c;如果在这FixedUpdate或Update函数内更新AnimationRigging内的权重后&#xff0c;内部动画系统会覆盖权重的修改&#xff0c;导致无法正确更新&…

通过docker-compose部署NGINX服务,并使该服务开机自启

要在通过docker-compose部署的NGINX服务实现开机自启&#xff0c;你需要确保Docker守护进程在系统启动时自动运行&#xff0c;并配置docker-compose.yml文件以在容器中运行NGINX服务。以下是步骤&#xff1a; 确保Docker守护进程开机启动&#xff1a; 在Ubuntu/Debian上&#x…