基于python的马尔可夫模型初识

基于python的马尔可夫模型初识

  • **1.什么是随机过程?**
    • **1.1模拟赌徒的毁灭Gambler's Ruin**
  • **2.马尔可夫链(Markov Chains)**
    • **2.1马尔可夫链模拟**
    • **2.2马尔可夫转移概率图**
    • **2.3无记忆性:给定现在,未来独立于过去**
    • **2.4 n n n 步转移矩阵**
  • 3.示例

import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
#matplotlib parameters
plt.rcParams["figure.figsize"] = (12, 8)
plt.rcParams.update({'font.size': 14})

1.什么是随机过程?

随机过程是随机变量的集合: { X t , t ∈ I } , \{X_t,t \in I \}, {Xt,tI},其中: X t X_t Xt是时间 t t t的随机变量集, I I I是过程的索引集。

我们将在本教程中重点介绍的离散时间随机过程是随机变量序列。

1.1模拟赌徒的毁灭Gambler’s Ruin

我们可以用著名的赌徒破产的例子,这是一个随机过程。

在我们的例子中,一个赌徒从$50开始。为了简单起见,他们只能以$1的增量下注。他们每次下注只能赢或输$1。他们会继续赌博,直到输光所有的钱(带着$0离开)或者赢了$100。我们可以用以下符号将其形式化:

$\begin{equation}
X_{g} =
\begin{cases}
$+1, & \text{with a probability of 50%}\
$-1, & \text{with a probability of 50%}\
\end{cases}
\end{equation}$

式中: X g X_g Xg为以美元计的赌博结果.

Source: Introduction to Stochastic Processes with R by Robert P. Dobrow

def gamblers_ruin():gambling_money = 50gambling_goal = 100gambling_simulation = []while gambling_money in range(1,gambling_goal):bet_size = 1w_or_l = random.randrange(-1, 2, step = 2)gambling_money += bet_size * w_or_lgambling_simulation.append(gambling_money)return gambling_simulation
plt.plot(gamblers_ruin())
plt.yticks(np.arange(-20,120,10))
plt.axhline(y=0, color='r', linestyle='-')
plt.axhline(y=100, color='black', linestyle='-')
plt.xlabel('Number of bets')
plt.ylabel('Winnings')
plt.title('Gambling Simulation')

在这里插入图片描述

def prob_of_ruin(gambling_goal, initial_gambling_money):return (gambling_goal - initial_gambling_money)/gambling_goalprob_of_ruin(100,50)
sim_list = []while len(sim_list) < 500:sim_list.append(gamblers_ruin()[-1])np.mean(sim_list)

Source: Introduction to Stochastic Processes with R by Robert P. Dobrow

2.马尔可夫链(Markov Chains)

马尔可夫链是一种随机过程。

马尔可夫链是随机变量( X t X_t Xt)的集合,其中未来状态 ( j j j)仅取决于当前状态 ( i i i)。马尔可夫链可以是离散的或连续的。

对于马尔可夫链转移矩阵(表示为 P P P):

  • 每一行和为1,即: ∑ j P i j = 1 \sum\limits_{j}P_{ij} = 1 jPij=1.
  • 概率必须是非负的,即: P i j ≥ 0 ∀ i , j P_{ij} \geq 0 \ \ \forall \ \ i,j Pij0    i,j

Source: Markov Chain from Wolfram MathWorld

2.1马尔可夫链模拟

马尔可夫链可以由初始分布和转移矩阵模拟。
例子中,初始状态是纽约市New York。从最初的状态,我们可以旅行到:巴黎Paris,开罗Cairo,首尔Seoul,甚至纽约市New York City.

转移矩阵包含从一个状态移到另一个状态的一步转移概率。

mc_example = {'NYC': [.25,0,.75,1],'Paris': [.25,.25,0,0],'Cairo': [.25,.25,.25,0],'Seoul': [.25,.5,0,0]}mc = pd.DataFrame(data = mc_example, index = ['NYC', 'Paris', 'Cairo', 'Seoul'])

2.2马尔可夫转移概率图

在这里插入图片描述
我们可以用以下符号将马尔可夫链在初始起点(纽约市)的运动数理化:

P ( X 1 = New York ∣ X 0 = New York ) = P ( X 1 = Paris ∣ X 0 = New York ) = P ( X 1 = Cairo ∣ X 0 = New York ) = P ( X 1 = Seoul ∣ X 0 = New York ) = 25 % P(X_1 = \text{New York}|X_0 = \text{New York})=P(X_1 = \text{Paris}|X_0 = \text{New York})=P(X_1 = \text{Cairo}|X_0 = \text{New York}) = P(X_1 = \text{Seoul}|X_0 = \text{New York}) = 25\% P(X1=New YorkX0=New York)=P(X1=ParisX0=New York)=P(X1=CairoX0=New York)=P(X1=SeoulX0=New York)=25%

travel_sim = []
travel_sim.append(mc.iloc[0].index[0])
city = np.random.choice(mc.iloc[0].index, p = mc.iloc[0])
travel_sim.append(city)while len(travel_sim) < 25:city = np.random.choice(mc.iloc[mc.index.get_loc(city)].index, p = mc.iloc[mc.index.get_loc(city)])travel_sim.append(city)
travel_sim
['NYC','Cairo','NYC','Seoul','NYC','Paris','Paris','Paris','Seoul','NYC','Cairo','Cairo','NYC','NYC','NYC','Cairo','NYC','NYC','Paris','Cairo','NYC','NYC','Paris','Cairo','Cairo']
mc
	    NYC	   Paris	 Cairo	 Seoul
NYC	    0.25  	0.25	0.25	0.25
Paris	0.00	0.25	0.25	0.50
Cairo	0.75	0.00	0.25	0.00
Seoul	1.00	0.00	0.00	0.00

2.3无记忆性:给定现在,未来独立于过去

马尔可夫链的一个重要特征是它们是无记忆的。看例子可知,唯一重要的状态是当前状态。 如果我们的从纽约开始 ( X 0 = N Y C X_0 = NYC X0=NYC) 去了巴黎 ( X 1 = P a r i s X_1 = Paris X1=Paris), 然后到下一个城市 ( X 2 X_2 X2)只取决于从巴黎出发的可能性. 最初在纽约开始出发这一事实并不影响到 X 2 . X_2. X2.

2.4 n n n 步转移矩阵

mc.to_numpy()
array([[0.25, 0.25, 0.25, 0.25],[0.  , 0.25, 0.25, 0.5 ],[0.75, 0.  , 0.25, 0.  ],[1.  , 0.  , 0.  , 0.  ]])
def matrix_power(matrix, power):if power == 0:return np.identity(len(matrix))elif power == 1:return matrixelse:return np.dot(matrix, matrix_power(matrix, power-1))
matrix_power(mc.to_numpy(), 2)
array([[0.5   , 0.125 , 0.1875, 0.1875],[0.6875, 0.0625, 0.125 , 0.125 ],[0.375 , 0.1875, 0.25  , 0.1875],[0.25  , 0.25  , 0.25  , 0.25  ]])
np.dot(np.dot(mc.to_numpy(), mc.to_numpy()))
array([[0.5   , 0.125 , 0.1875, 0.1875],[0.6875, 0.0625, 0.125 , 0.125 ],[0.375 , 0.1875, 0.25  , 0.1875],[0.25  , 0.25  , 0.25  , 0.25  ]])
matrix_power(mc.to_numpy(), 2).sum(axis=1)
array([1., 1., 1., 1.])

上述两步转移矩阵告诉我们的是,如果我们观察纽约的状态 i i i,那么在两步之后,有50%的概率回到纽约市,有12.5%的概率会前往巴黎,有18.75%的概率会到达开罗或首尔。

for i in range(1,15,1):print(f'n Step Transition Matrix at the nth power {i}\n', matrix_power(mc.to_numpy(), i),'\n')
n Step Transition Matrix at the nth power 1[[0.25 0.25 0.25 0.25][0.   0.25 0.25 0.5 ][0.75 0.   0.25 0.  ][1.   0.   0.   0.  ]] n Step Transition Matrix at the nth power 2[[0.5    0.125  0.1875 0.1875][0.6875 0.0625 0.125  0.125 ][0.375  0.1875 0.25   0.1875][0.25   0.25   0.25   0.25  ]] n Step Transition Matrix at the nth power 3[[0.453125 0.15625  0.203125 0.1875  ][0.390625 0.1875   0.21875  0.203125][0.46875  0.140625 0.203125 0.1875  ][0.5      0.125    0.1875   0.1875  ]] n Step Transition Matrix at the nth power 4[[0.453125   0.15234375 0.203125   0.19140625][0.46484375 0.14453125 0.19921875 0.19140625][0.45703125 0.15234375 0.203125   0.1875    ][0.453125   0.15625    0.203125   0.1875    ]] n Step Transition Matrix at the nth power 5[[0.45703125 0.15136719 0.20214844 0.18945312][0.45703125 0.15234375 0.20214844 0.18847656][0.45410156 0.15234375 0.203125   0.19042969][0.453125   0.15234375 0.203125   0.19140625]] n Step Transition Matrix at the nth power 6[[0.45532227 0.15209961 0.20263672 0.18994141][0.4543457  0.15234375 0.20288086 0.19042969][0.45629883 0.15161133 0.20239258 0.18969727][0.45703125 0.15136719 0.20214844 0.18945312]] n Step Transition Matrix at the nth power 7[[0.45574951 0.15185547 0.20251465 0.18988037][0.45617676 0.15167236 0.20239258 0.1897583 ][0.45556641 0.15197754 0.20257568 0.18988037][0.45532227 0.15209961 0.20263672 0.18994141]] n Step Transition Matrix at the nth power 8[[0.45570374 0.15190125 0.20252991 0.18986511][0.45559692 0.15196228 0.20256042 0.18988037][0.45570374 0.15188599 0.20252991 0.18988037][0.45574951 0.15185547 0.20251465 0.18988037]] n Step Transition Matrix at the nth power 9[[0.45568848 0.15190125 0.20253372 0.18987656][0.45569992 0.1518898  0.20252991 0.18988037][0.45570374 0.15189743 0.20252991 0.18986893][0.45570374 0.15190125 0.20252991 0.18986511]] n Step Transition Matrix at the nth power 10[[0.45569897 0.15189743 0.20253086 0.18987274][0.45570278 0.15189743 0.20252991 0.18986988][0.45569229 0.15190029 0.20253277 0.18987465][0.45568848 0.15190125 0.20253372 0.18987656]] n Step Transition Matrix at the nth power 11[[0.45569563 0.1518991  0.20253181 0.18987346][0.45569301 0.15190005 0.20253253 0.18987441][0.4556973  0.15189815 0.20253134 0.18987322][0.45569897 0.15189743 0.20253086 0.18987274]] n Step Transition Matrix at the nth power 12[[0.45569623 0.15189868 0.20253164 0.18987346][0.45569706 0.15189826 0.2025314  0.18987328][0.45569605 0.15189886 0.2025317  0.1898734 ][0.45569563 0.1518991  0.20253181 0.18987346]] n Step Transition Matrix at the nth power 13[[0.45569624 0.15189873 0.20253164 0.1898734 ][0.45569609 0.15189883 0.20253168 0.1898734 ][0.45569618 0.15189873 0.20253165 0.18987344][0.45569623 0.15189868 0.20253164 0.18987346]] n Step Transition Matrix at the nth power 14[[0.45569618 0.15189874 0.20253165 0.18987342][0.45569618 0.15189873 0.20253165 0.18987344][0.45569623 0.15189873 0.20253164 0.18987341][0.45569624 0.15189873 0.20253164 0.1898734 ]] 

我们可以看到,随着步数的增加,概率会趋于一种被称为稳态分布(也称为稳态向量)的状态。

假设这次从首尔开始我们的旅程。在这种情况下,我们可以将初始分布表示为: α = [ 0 , 0 , 0 , 1 ] \alpha = [0,0,0,1] α=[0,0,0,1]。现在我们来找出从现在起两次行程后最终回到首尔的概率。

initial_dist = np.asarray([0,0,0,1])mc_p2 = matrix_power(mc.to_numpy(),2)np.dot(initial_dist,mc_p2)
array([0.25, 0.25, 0.25, 0.25])

3.示例

在这里插入图片描述

mc_example2 = {'hamburger': [.2,.3,.5],'pizza': [.6,0,0],'hot-dog': [.2,.7,.5]}mc2 = pd.DataFrame(data = mc_example2, index = ['hamburger', 'pizza', 'hot-dog'])
mc2
	    hamburger	pizza	hot-dog
hamburger	0.2	0.6	0.2
pizza	    0.3	0.0	0.7
hot-dog	    0.5	0.0	0.5
np.dot(mc2.to_numpy(), mc2.to_numpy())
array([[0.32, 0.12, 0.56],[0.41, 0.18, 0.41],[0.35, 0.3 , 0.35]])
steps = 2
def matrix_power(matrix, power):if power == 0:return np.identity(len(matrix))elif power == 1:return matrixelse:return np.dot(matrix, matrix_power(matrix, power-1))
matrix_power(mc2.to_numpy(), steps)
array([[0.32, 0.12, 0.56],[0.41, 0.18, 0.41],[0.35, 0.3 , 0.35]])
matrix_power(mc2.to_numpy(), steps).sum(axis=1)
array([1., 1., 1.])
for i in range(1,11,1):print(f'n Step Transition Matrix at the nth step {i}\n', matrix_power(mc2.to_numpy(), i),'\n')
n Step Transition Matrix at the nth step 1[[0.2 0.6 0.2][0.3 0.  0.7][0.5 0.  0.5]] n Step Transition Matrix at the nth step 2[[0.32 0.12 0.56][0.41 0.18 0.41][0.35 0.3  0.35]] n Step Transition Matrix at the nth step 3[[0.38  0.192 0.428][0.341 0.246 0.413][0.335 0.21  0.455]] n Step Transition Matrix at the nth step 4[[0.3476 0.228  0.4244][0.3485 0.2046 0.4469][0.3575 0.201  0.4415]] n Step Transition Matrix at the nth step 5[[0.35012 0.20856 0.44132][0.35453 0.2091  0.43637][0.35255 0.2145  0.43295]] n Step Transition Matrix at the nth step 6[[0.353252 0.210072 0.436676][0.351821 0.212718 0.435461][0.351335 0.21153  0.437135]] n Step Transition Matrix at the nth step 7[[0.35201   0.2119512 0.4360388][0.3519101 0.2110926 0.4369973][0.3522935 0.210801  0.4369055]] n Step Transition Matrix at the nth step 8[[0.35200676 0.211206   0.43678724][0.35220845 0.21114606 0.43664549][0.35215175 0.2113761  0.43647215]] n Step Transition Matrix at the nth step 9[[0.35215677 0.21120406 0.43663917][0.35210825 0.21132507 0.43656668][0.35207925 0.21129105 0.43662969]] n Step Transition Matrix at the nth step 10[[0.35211216 0.21129406 0.43659378][0.35210251 0.21126495 0.43663254][0.35211801 0.21124755 0.43663443]] 
initial_dist = np.asarray([0,1,0])for i in range(1,11,1):print(f'start pizza then n Step Transition Vector at the nth step {i}\n', np.dot(initial_dist,matrix_power(mc2.to_numpy(), i)),'\n')
start pizza then n Step Transition Vector at the nth step 1[0.3 0.  0.7] start pizza then n Step Transition Vector at the nth step 2[0.41 0.18 0.41] start pizza then n Step Transition Vector at the nth step 3[0.341 0.246 0.413] start pizza then n Step Transition Vector at the nth step 4[0.3485 0.2046 0.4469] start pizza then n Step Transition Vector at the nth step 5[0.35453 0.2091  0.43637] start pizza then n Step Transition Vector at the nth step 6[0.351821 0.212718 0.435461] start pizza then n Step Transition Vector at the nth step 7[0.3519101 0.2110926 0.4369973] start pizza then n Step Transition Vector at the nth step 8[0.35220845 0.21114606 0.43664549] start pizza then n Step Transition Vector at the nth step 9[0.35210825 0.21132507 0.43656668] start pizza then n Step Transition Vector at the nth step 10[0.35210251 0.21126495 0.43663254] 

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

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

相关文章

Python金色流星雨

系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

Python图像处理——基于ResNet152的人脸识别签到系统(Pytorch框架)

&#xff08;1&#xff09;数据集制作 本次使用明星做为数据集&#xff0c;首先编写爬虫函数&#xff0c;根据关键字爬取对应的明星&#xff0c;爬取结果保存至data文件夹&#xff0c;并以标签名作为文件名。具体爬取的明星如下&#xff1a; 注&#xff1a;实际应用中&#xf…

linux下gpio模拟spi三线时序

目录 前言一、配置内容二、驱动代码实现三、总结 前言 本笔记总结linux下使用gpio模拟spi时序的方法&#xff0c;基于arm64架构的一个SOC&#xff0c;linux内核版本为linux5.10.xxx&#xff0c;以驱动三线spi(时钟线sclk&#xff0c;片选cs&#xff0c;sdata数据读和写使用同一…

华为鸿蒙HarmonyOS应用开发者高级认证视频及题库答案

华为鸿蒙开发者高级认证的学习资料 1、课程内容涵盖HarmonyOS系统介绍、DevEco Studio工具使用、UI设计与开发、Ability设计与开发、分布式特性、原子化服务卡片以及应用发布等。每个实验都与课程相匹配&#xff0c;帮助加深理解并掌握技能 2、学习视频资料 华为HarmonyOS开发…

Minio文件服务器:SpringBoot实现文件上传

在Minio文件服务器部署成功后(参考上篇文章Minio文件服务器&#xff1a;安装)接下来我们通过SpringBoot框架写一个接口&#xff0c;来实现文件的上传功能&#xff1a;文件通过SpringBoot接口&#xff0c;上传到Minio文件服务器。并且&#xff0c;如果上传的文件是图片类型&…

2025考研各省市网上确认时间汇总!

2025考研各省市网上确认时间汇总&#xff01; 安徽&#xff1a;11月1日至5日 福建&#xff1a;11月1日-11月5日 山东&#xff1a;10月31日9:00至11月5日12:00 新疆&#xff1a;10月31日至11月4日17:00 湖南&#xff1a;11月1日9:00-4日12:00 广东&#xff1a;10月下旬至1…

【mysql进阶】4-3. 页结构

页面结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤&#xff0c;为了能发挥更好的性能&#xff0c;可以结合⾃⼰系统的业务场景和数据⼤⼩&#xff0c;对⻚相关的系统变量进⾏调整&#xff0c;⻚的⼤⼩就是⼀个⾮常重要的调整项。同时关于⻚的结构也要有所了解&#xff0c;以…

Word中Normal.dotm样式模板文件

Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份&#xff0c;在下载本文中的Normal.dotm文件&#xff0c;进行替换&#xff0c;重新打开word即可使用。 字体样式如下&#xff08;可自行修改&#…

Tongweb7049m4+THS6010-6012版本 传真实ip到后端(by yjm+lwq)

遇到客户需要通过ths传真实ip到后端也就是部署到tongweb的需求&#xff0c;在ths的httpserver.conf里的location块配置了以下内容&#xff1a; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwar…

leetcode hot100(1)

1.160.相交链表 &#xff08;1&#xff09;暴力解法 循环遍历listA的所有节点&#xff0c;循环内遍历B所有节点&#xff0c;检查当前遍历到的的A、B中的节点是否一致。 如果一致&#xff0c;标记&#xff0c;跳出循环。 最后根据标记为返回结果。 时间复杂度O(len(A)*len(…

解决torch识别不到cuda的问题——AssertionError: Torch not compiled with CUDA enabled

问题表现 测试torch-gpu是否可用 运行如下代码&#xff1a; import torch print(f"Current device: {device}") print(torch.__version__) # 查看pytorch安装的版本号 print(torch.cuda.is_available()) # 查看cuda是否可用。True为可用&am…

Java学习Day53:铲除紫云山金丹原料厂厂长(手机快速登录、权限控制)

1.手机快速登录 手机快速登录功能&#xff0c;就是通过短信验证码的方式进行登录。这种方式相对于用户名密码登录方式&#xff0c;用户不需要记忆自己的密码&#xff0c;只需要通过输入手机号并获取验证码就可以完成登录&#xff0c;是目前比较流行的登录方式。 前端页面&…

Halcon 多相机统一坐标系(标定)

多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。 在计算机视觉和机器视觉领域中&#xff0c;多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。 以gen_binocular_rectification_map&#xff08;生成描述图像映…

Python条形图 | 指标(特征)重要性图的绘制

在数据科学和机器学习的工作流程中&#xff0c;特征选择是一个关键步骤。通过评估每个特征对模型预测能力的影响&#xff0c;我们可以选择最有意义的特征&#xff08;指标&#xff09;&#xff0c;从而提高模型的性能并减少过拟合。本文将介绍如何使用 Python 的 Seaborn 和 Ma…

Vue.js 组件开发教程:从基础到进阶

Vue.js 组件开发教程:从基础到进阶 引言 在现代前端开发中,Vue.js 作为一款流行的 JavaScript 框架,以其简单易用和灵活性赢得了开发者的青睐。Vue 组件是 Vue.js 的核心概念之一,理解组件的开发和使用对构建复杂的用户界面至关重要。本篇文章将详细介绍 Vue.js 组件的开…

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候&#xff0c;sg是要检查门的极性的。 如果qualifier和src经过与门汇聚&#xff0c;在同另一个src1信号或门汇聚&#xff0c;sg是报unsync的。 假设当qualifier为0时&#xff0c;0&&src||src1src1&#xff0c;src1无法被gat…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…

好用的idea插件之自动sql生成

功能 自动化代码生成&#xff1a; 通过解析数据库表结构和实体类定义&#xff0c;自动生成对应的Mapper接口、XML映射文件、Service、DAO和实体类等代码。支持快速生成增删查改&#xff08;CRUD&#xff09;代码&#xff0c;以及在表结构变化后重新生成代码而不覆盖自定义方法。…

#【2024年10月26日更新】植物大战僵尸杂交本V2.6更新内容与下载

更新内容 新增植物&#xff1a; 英雄植物&#xff1a;终极射手、向日葵公主、汉堡王&#xff08;仅限英雄模式使用&#xff09;。星卡植物&#xff1a;星星盒子、猫窝、迷幻投手、玉米旋转机&#xff08;需要一定数量的星星解锁&#xff09;。挑战植物&#xff1a;金卡黄金锤子…

什么是 VolTE 中的 Slient Redial?它和 CSFB 什么关系?

目录 1. 什么是 Silent Redial(安静的重拨号)? 2. Silent Redial 信令流程概述 3. 总结 Silent Redial 和 CSFB 啥关系? 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都…