马尔可夫预测(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.rhkb.cn/news/245586.html

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

相关文章

前端学习:HTTP协议、请求响应、分层解耦

HTTP协议 HTTP-概述 HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。如果想知道http协议的数据传输格式有哪些,可以打开浏览器,点击 F12 打开开发者工具,点击Network 来…

EIGRP实验

实验大纲 一、基本配置 1.构建网络拓扑结构图 2.路由器基本配置 3.配置PC 4.测试连通性 5.保存配置文件 二、配置EIGRP 1.查看路由表 2.配置EIGRP动态路由 3.查看路由器路由表 4.测试网络连通性 5.查看所有路由器的路由协议 6.保存配置文件 三、配置OSPF 1.配置…

vue3+naiveUI二次封装的v-model 联动输入框

根据官网说明使用 源码 <template><div class"clw-input pt-3"><n-inputref"input":value"modelValue":type"type":title"title"clearable:disabled"disabled":size"size"placeholder&…

Ansible自动化运维(三)Playbook 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

故事机手机平板等智能硬件DVT阶段可靠性测试方法

DVT是什么 DVT是设计样品验证测试评审阶段&#xff0c;这个阶段要进行全面的&#xff0c;客观的测试&#xff0c; 主要测试项目包括&#xff1a;功能测试&#xff0c;安规测试&#xff0c;性能测试&#xff0c;合规测试&#xff08;兼容性&#xff09;&#xff0c;机械测试&am…

数据结构——用Java实现二分搜索树

目录 一、树 二、二分搜索树 1.二叉树 2.二分搜索树 三、代码实现 1.树的构建 2.获取树中结点的个数 3.添加元素 4.查找元素 &#xff08;1&#xff09;查找元素是否存在 &#xff08;2&#xff09;查找最小元素 &#xff08;3&#xff09;查找最大元素 5.二分搜索…

256:vue+openlayers利用高德逆地理编码,点击地图,弹出某点坐标和地址信息

第256个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用高德逆地理编码,点击地图,弹出某点坐标和地址信息。这里要仔细阅读高德地图的逆编码API,同时要注意的是,这种转换在中国很好用,到了欧美国家就不好使了。 直接复制下面的 vue+openlayers源代码…

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

目录 SpringBootWeb案例033. 员工管理3.1 分页查询3.1.1 基础分页3.1.1.1 需求分析3.1.1.2 接口文档3.1.1.3 思路分析3.1.1.4 功能开发3.1.1.5 功能测试3.1.1.6 前后端联调 3.1.2 分页插件3.1.2.1 介绍3.1.2.2 代码实现3.1.2.3 测试 3.2 分页查询(带条件)3.2.1 需求3.2.2 思路分…

vue3---inputRef.value.focus()报错Cannot read properties of null (reading ‘focus‘)

问题描述&#xff1a;点击编辑按钮&#xff0c;出现el-input框&#xff08;el-input显示隐藏通过v-if控制&#xff09; <el-input ref"inputRef" v-if"isEdit" v-model"modelName" blur"isEdit false" /> <el-button text …

大模型学习与实践笔记(十三)

将训练好的模型权重上传到 OpenXLab 方式1&#xff1a; 先将Adapter 模型权重通过scp 传到本地&#xff0c;然后网页上传 步骤1. scp 到本地 命令为&#xff1a; scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…

为什么时序逻辑电路会落后一拍?

1、时序逻辑电路落后一拍&#xff1f; FPGA初学者可能经常听到一句话&#xff1a;“时序逻辑电路&#xff0c;或者说用 < 输出的电路会延迟&#xff08;落后&#xff09;一个时钟周期。”但在仿真过程中经常会发现不符合这一“定律”的现象–明明是在仿真时序逻辑&#xff…

C#winform上位机开发学习笔记13-串口助手显示系统时间功能添加

1.功能描述 在上位机中显示系统的实时时间 2.代码部分 步骤1&#xff1a;添加文本框控件并设置参数 #此处注意将BackColor颜色修改为非Control&#xff0c;即可正常显示ForeColor颜色&#xff0c;否则该颜色不变&#xff0c;原因暂且不明。 步骤2&#xff1a;添加timer控件…

GC26E31S国产芯片可替代AM26LV31E/TI,适用于马达编码等产品上

众所周知AM26LV31E是一款具有三态输出的四路差分线路驱动器。该驱动器具有15kV ESD&#xff08;HBM和IEC61000-4-2&#xff0c;气隙放电&#xff09;和8kV ESD&#xff08;IEC61000-4-2&#xff0c;接触放电&#xff09;保护。该器件旨在满足TIA /EIA-422-B和ITU建议V.11驱动器…

Dify学习笔记-知识库(六)

1、知识库 大多数语言模型采用较为陈旧的训练数据&#xff0c;并且对每次请求的上下文有长度限制。例如 GPT-3.5 是基于 2021 年的语料进行训练的&#xff0c;且有每次约 4K Token 的限制。这意味着开发者如果想让 AI 应用基于最新的、私有的上下文对话&#xff0c;必须使用类…

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化5.写到最后 …

springboot-mybatis项目

一、后端开发环境搭建 1、File->New->Projet 2选择 Spring Initializr &#xff0c;然后选择默认的 url 点击next 3勾选Spring Web、SQL模板&#xff0c;next 4点击finish&#xff0c;搭建完成 二 数据库 1 新建数据库 2 执行sql建表 SET NAMES utf8mb4; SET FOREIGN…

爬虫js逆向分析——x平台(实现)

爬虫js逆向分析——x平台&#xff08;实现&#xff09; &#xff08;仅供学习&#xff0c;本案例只是分析流程没有账号&#xff09;网址&#xff1a;https://xuexi.chinabett.com/ 1.分析请求包格式 打开控制台&#xff0c;并勾选保存日志&#xff0c;然后点击登录看发送了什…

外贸邮件群发软件有哪些?邮件群发的系统?

外贸邮件群发软件哪个比较好&#xff1f;外贸开发信软件推荐&#xff1f; 对于许多外贸企业来说&#xff0c;邮件营销是一种非常有效的推广方式。那么&#xff0c;外贸邮件群发软件就成为了必备的工具。蜂邮EDM将为你揭秘几款主流的外贸邮件群发软件&#xff0c;助你更好地开展…

linux安装docker(入门一)

环境&#xff1a;centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…

shell脚本——条件语句与循环语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…