马尔可夫预测(Python)

马尔科夫链(Markov Chains)        

从一个例子入手:假设某餐厅有A,B,C三种套餐供应,每天只会是这三种中的一种,而具体是哪一种,仅取决于昨天供应的哪一种,换言之,如果知道今天供应了什么,就可以用某种方式预测明天将会供应什么。

        例如,今天供应的是A,那么明天有60%概率供应B,我们可以用一条由A向B的有向边来表示,边权是概率。于是我们可以用图来表示这种关系:

这就是一个马尔科夫链。

马尔科夫链的一个重要状态就是未来状态只取决于现在状态而与过去无关。

也就是有

P(X_{n+1}=x | X_1=x_1,...,X_n=x_n)=P(X_{n+1}=x | X_n=x_n) 

   例如考虑已知一个供应序列[B,A,B],那么第4天供应C的概率是多少?由马尔可夫性质,我们只需要考虑第3天,因此概率就是70%。

下面我们在链上做随机漫步(Random Walk),比如得到结果[A, B, A, C, A, C, C, C, A, B],现在我们想要求出每种套餐的概率,直接用频率分布近似,而长期下来,这些概率(可能)会收敛到某些特定值,这种概率分布叫做稳态分布。

我们亦可用线性代数来求出稳态的概率分布,对于有向图,我们可以转化为邻接矩阵:

M = \begin{bmatrix} 0.2 & 0.6 &0.2 \\ 0.3& 0 &0.7 \\ 0.5 & 0 &0.5 \end{bmatrix}

我们用一个行向量\pi来代表状态的概率,假设我们从B状态开始,则有 

\pi_0=\begin{bmatrix} 0 & 1 & 0 \end{bmatrix}

当我们将这个行向量和矩阵相乘,我们得到了矩阵的第二行,更广义地,我们得到了未来的状态。

\pi_1 = \pi_0M

依次类推,那么我们可以说,如果在某一次达到了稳态,那么输出的行向量应当等于输入的行向量,于是我们得到了这个在线性代数中熟悉的表达式

\pi M=\pi

因此\pi其实是矩阵的特征向量,特征值等于1,此外\pi的元素还需要满足归一性,也即全部元素之和等于1。

由此我们可以解出这个稳态:\pi=[\frac{25}{71},\frac{15}{71},\frac{31}{71}],这个结果和直接模拟得到的相符合。

这个结果告诉我们,餐厅整体上会在大概35%的时间供应A,21%的时间供应B,剩下时间供应C。

由此我们也可以看出可能存在多个稳态,取决于有多少个满足条件的特征向量。

现在考虑下面这个马尔科夫链:

 我们会发现对于状态0只要离开就不可能再回去了,这种不可被其他状态达到的情况我们称为暂态(transient)。

而对于状态1、2离开后是可以回来的,称为常返状态(Recurrent)

而当存在暂态时,我们称这个马尔科夫链是可约的;反之称不可约链

这里我们如果把0->1这条边删去,可以得到两个更小的不可约链。

现在考虑下面这个马尔科夫链

A=\begin{bmatrix} 0.5 &0.2 &0.3 \\ 0.6&0.2 &0.2 \\ 0.1& 0.8 &0.1 \end{bmatrix} 

考虑这个问题:

        从状态i到状态j共n步的概率(P_{ij}(n))是多大?

可以先考虑简单的,P_{02}(1)显然等于A_{02} 

而对于P_{02}(2),我们需要考虑所有可能的路径,并将概率相加:A_{01}\times A_{12} + A_{00}\times A_{02}+A_{02}\times A_{22}

这个表达式其实是两个向量乘积\begin{bmatrix} A_{00} & A_{01} &A_{02} \end{bmatrix}\times\begin{bmatrix} A_{02}\\ A_{12}\\ A_{22} \end{bmatrix}

由此我们可以总结P_{ij}(2)=A^2_{ij}

进一步P_{ij}(n)=A^n_{ij}

这样的总结是根据经验的归纳,不能保证正确。

但确实是正确的,根据是Chapman-Kolmogorov定理,之所以能使用,是因为马尔可夫性质

该定理表述如下:

P_{ij}(n)=\sum_{k}P_{ik}(r)\times P_{kj}(n-r)

 现在我们从另一个视角来看稳态分布,我们让n趋于无穷大

\lim_{n \to \infty}A^n=\begin{bmatrix} 0.4444 &0.3333 &0.2222 \\ 0.4444 &0.3333 &0.2222 \\ 0.4444&0.3333 & 0.2222 \end{bmatrix}

每一行都收敛到同一个行向量,这就是这个马尔科夫链的静态分布。

比如对于A_{ij}^\infty=P_{ij}(\infty),对于不同的i其值是不变的,换言之,不依赖于开始的状态,这恰恰符合马尔可夫性质。

 隐马尔科夫链(Hidden Markov Model)

仍然从例子入手:

Jack 所住的地方只有三种天气A,B,C,任何一天只会出现一种天气,明天天气只和今天天气相关。 假设Jack每天有两种可能的心情a、b,心情取决于天气。如下图

 

 现在我们不知道某一天的天气情况,但是我们可以了解Jack的情绪,因此说马尔科夫链的状态是隐藏的,我们可以观察到一些依赖于这些状态的变量。可以说,隐马尔可夫模型就是一个普通的马尔科夫链和一组观测变量构成,即

HMM = HiddenMC + Observed Variables

注意:Jack的情绪只和当天的天气有关而和昨天的情绪无关 

同样我们可以用矩阵表示

转移矩阵:\begin{bmatrix} 0.5 &0.3 &0.2 \\ 0.4 &0.2 &0.4 \\ 0.0& 0.3 &0.7 \end{bmatrix} 

发射矩阵(记录观测变量相应概率的矩阵):\begin{bmatrix} 0.9 &0.1 \\ 0.6 & 0.4\\ 0.2 &0.8 \end{bmatrix}

 现在考虑连续三天的情况

这里先假设我们知道天气情况,那么这种情况的概率我们可以算出来:

P(Y='bba',X='CBC') = P(X_1 = C) \times P(Y_1=b | X_1 = C) \times P(X_2=B|X_1=C) \times P(Y_2=b|X_2=B) \times P(X_3 =C|X_2=B) \times P(Y_3=a|X_3=C)

其中第一项P(X_1=C)需要用求平稳分布得到,其余项可以直接从矩阵读出。 

 现在我们隐藏状态,只看观察变量的序列,最有可能的状态序列是什么?

要解决这个问题,我们需要计算每个序列的概率,找出概率最大的序列,而最终找出来确实是CBC这个序列。

Python模板代码

详见注释

from hmmlearn.hmm import GaussianHMM
# 导入 GaussianHMM 类,这是 hmmlearn 库中用于高斯混合模型(Gaussian Hidden Markov Model)的类。
import numpy as np
startprob = np.array([0.6, 0.3, 0.1, 0.0])
# 建一个 NumPy 数组 startprob,表示 HMM 模型的初始状态概率。
transmat = np.array([[0.7, 0.2, 0.0, 0.1],[0.3, 0.5, 0.2, 0.0],[0.0, 0.3, 0.5, 0.2],[0.2, 0.0, 0.2, 0.6]])
# 创建一个 NumPy 数组 transmat,表示 HMM 模型的状态转移矩阵。
means = np.array([[0.0,  0.0],[0.0, 11.0],[9.0, 10.0],[11.0, -1.0]])
# 表示每个隐藏状态的均值。
covars = .5 * np.tile(np.identity(2), (4, 1, 1))
# 表示每个隐藏状态的协方差矩阵。这里使用了 np.tile 来生成相同的协方差矩阵。
hmm = GaussianHMM(n_components=4, covariance_type='full')
# 创建一个 GaussianHMM 对象,指定模型有 4 个隐藏状态,并使用完整的协方差矩阵
hmm.startprob_ = startprob
# 设置 HMM 模型对象的初始状态概率。
hmm.transmat_ = transmat
# 设置 HMM 模型对象的状态转移矩阵。
hmm.means_ = means
# 设置 HMM 模型对象的均值。
hmm.covars_ = covars
# 设置 HMM 模型对象的协方差矩阵。
seen = np.array([[1.1, 2.0], [-1, 2.0], [3, 7]])
# seen表示观察到的数据序列。
logprob, state = hmm.decode(seen, algorithm="viterbi")
# 使用 Viterbi 算法对给定的观察数据序列进行解码,返回对数概率和对应的状态序列。
print(state)
print(hmm.score(seen))

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

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

相关文章

2024年会是大牛市吗?我有500万想找个证券公司开融资融券账户,哪家券商两融利率最低?

2024年是否会迎来大牛市,这是一个颇具争议的话题。然而,无论市场走势如何,对于有500万的投资者来说,开立一个融资融券账户确实是一个不错的选择。在选择券商时,除了考虑两融利率外,投资者还应该关注券商的服…

10. UE5 RPG使用GameEffect创建血瓶修改角色属性

前面我们通过代码实现了UI显示角色的血量和蓝量,并实现了初始化和在数值变动时实时更新。为了测试方便,没有使用GameEffect去修改角色的属性,而是通过代码直接修改的数值。 对于GameEffect的基础,这里不再讲解,如果需要…

5.列表选择弹窗(BottomListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 从底部弹出的列表选择弹窗。 1.布局 <?xml version"1.0" encoding"utf-8" ?> <toolkit:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns…

幻兽帕鲁游戏多人联机服务器价格对比:腾讯云VS阿里云VS华为云

《幻兽帕鲁》游戏5天捞金15亿&#xff0c;而且想要多人联机玩游戏&#xff0c;还允许我们自己购买服务器来搭建专属服务器&#xff0c;届时三五好友一起来玩&#xff0c;真的不要太爽啊&#xff01;那么搭建幻兽帕鲁游戏多人联机的服务器需要多少钱&#xff1f;下面boke112百科…

搜索引擎Elasticsearch了解

1.Lucene 是什么? 2.模块介绍 Lucene是什么: 一种高性能,可伸缩的信息搜索(IR)库 在2000年开源,最初由鼎鼎大名的Doug Cutting开发 是基于Java实现的高性能的开源项目 Lucene采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使它在读…

【JaveWeb教程】(28)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(1)

目录 SpringBootWeb案例011. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理 SpringBootWeb案例01 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库…

偏差,均方根误差RMSE

目录 一、均方误差MSE​编辑 二、R自定义函数 三、均方根误差(RMSE), 平均绝对误差(MAE), 标准差(Standard Deviation)的对比 参考&#xff1a; 一、均方误差MSE 这里使用trace是因为多元情形下方差是矩阵。 二、R自定义函数 来自&#xff1a;2022 - Biometrical Journal - …

electron-builder vue 打包后element-ui字体图标不显示问题

当使用electron打包完成的时候&#xff0c;启动项目发现使用的element-ui字体图标没显示都变成了小方块&#xff0c;并出现报错&#xff0c;请看下图&#xff1a; 解放方法&#xff1a; 在vue.config.js中设置 customFileProtocol字段&#xff1a;pluginOptions: {electronBui…

单片机之keil软件环境搭建

简介 Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案&#xff0c;通过一个集成开发环境&#xff08;μVision&#xff09;将这些部分组合在一起。     目前软件对中文的支持不友好&#xff0c;不建议安装网上的一些汉化包…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

学习笔记之 机器学习之预测雾霾

文章目录 Encoder-DecoderSeq2Seq (序列到序列&#xff09; Encoder-Decoder 基础的Encoder-Decoder是存在很多弊端的&#xff0c;最大的问题就是信息丢失。Encoder将输入编码为固定大小的向量的过程实际上是一个“信息有损的压缩过程”&#xff0c;如果信息量越大&#xff0c;…

CentOS网络配置进阶:深入研究network服务和NetworkManager

前言 如果你正在使用CentOS系统,并且想要深入了解网络管理和配置,那么本文肯定适合你!在这篇文章中,作者深入探讨了CentOS中的两种网络管理方式:network服务和NetworkManager。通过详实的讲解和实用的示例,你将会学习到如何使用这两种工具来管理网络接口、配置IP地址、网…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储&#xff0c;这是一种连接MySQL数据库的方式。在本篇文章中&#xff0c;将详细介绍如何使用pym…

Android开发修炼之路——(一)Android App开发基础-1

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

C++:优先队列-Priority_queue

目录 1.关于优先队列 2.priority_queue的使用 1.构造方法 2.empty();判空 3.size(); 4.top(); 5.push(val); 6.pop(); 3.优先队列模拟实现 4.用优先队列解决数组中第K个大的元素 1.关于优先队列 在C中&#xff0c;可以使用STL&#xff08;标准模板库&#xff09;中的p…

【Uni-App】Vuex在vue3版本中的使用与持久化

Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简而言之就是用来存数据&#xff0c;可以有效减少使用组件传参出现的问题。 基本元素&#xff1a;…

如何解决服务器端口被占用的问题,减少带来的影响

在现代网络环境中&#xff0c;服务器扮演着至关重要的角色&#xff0c;其稳定性和安全性对企业的正常运营具有重要意义。然而&#xff0c;服务器端口被占用的问题却时常困扰着企业网络管理员。本文将深入探讨服务器端口被占用的影响&#xff0c;并提出相应的解决方案。 一、服务…

(2)(2.8) Holybro 900Mhz XBP9X无线电遥测设备

文章目录 前言 1 特点 2 规格 3 电源 4 引脚输出 5 下载 前言 Holybro XBP9X 无线电设备可使用 Digi 免费的 XCTU 软件或通过 Digi 简化的 AT 或 API 命令集轻松进行配置。无线电台采用 256 位 AES 加密技术&#xff0c;可在设备之间安全可靠地传输关键数据。无线电的射…

解决 Required Integer parameter ‘uid‘ is not present

1.原因分析 后端没接收到uid可能是前端没传递uid也可能是前端传递了uid&#xff0c;但是传递方式与后端接收方式不匹配&#xff0c;导致没接收到更大的可能是因为后端请求方式错了。比如&#xff1a; 2.解决方案 先确定前端传参方式与后端请求方式是匹配的后端get请求的话…

云计算项目六:升级网站运行平台|部署缓存服务|数据迁移|部署集群

升级网站运行平台&#xff5c;部署缓存服务&#xff5c;数据迁移&#xff5c;部署集群 案例1&#xff1a;升级网站运行平台步骤一&#xff1a;清除当前配置步骤二&#xff1a;部署LNMP步骤三&#xff1a;测试配置 案例2&#xff1a;部署内存存储服务步骤一&#xff1a;部署redi…