python之马尔科夫链及转移矩阵---详细介绍及代码说明

一、提出问题

马尔科夫链和转移矩阵是什么?马尔科夫链是如何生成的?以及如何使用?下面我来详细介绍!

二、马尔科夫链和转移矩阵的介绍

1、马尔科夫链(Markov chain)概述
机器学习算法中,马尔可夫链在时间序列模型广泛的应用。主要思想是不管初始状态是什么,只要状态转移矩阵不发生变化, 最终状态始终会收敛到一个固定值, 这种无记忆性叫马尔科夫属性。公式为:在这里插入图片描述
2、转移概率矩阵(Transition Probability Matrix)
转移概率矩阵:矩阵各元素都是用概率表示。其值非负,并且各行元素之和等于1。在一定条件下是互相转移的,故称为转移概率矩阵。
二步转移概率矩阵正好是一步转移概率矩阵的平方。k步转移概率矩阵是一步转移概率矩阵的k次方。k步转移概率矩阵中,各行元素之和也都为1。
例如:矩阵P某一位置P(i,j)的值为P(j|i),即从状态i转化到状态j的概率,如状态转移矩阵为:在这里插入图片描述
3、马尔科夫链形成过程
给定初始状态如:p0=[0.5, 0.2, 0.3], k步转化过程为:p0=p0*pk。计算机程序需要利用迭代变量,借助循环实现。经过多步转化p0收敛于固定值(稳态)。本实例为[ 0.6248219 0.31266282 0.06251528]。

三、举例说明,加深对马尔科夫链和转移矩阵的认知

1、题目要求
根据上述基本原理,用python程序验证马尔科夫链形成过程:两个初始状态 p01=[0.5, 0.2, 0.3],p02=[0.1,0.4,0.5]; 状态转移矩阵都为p=[[0.9, 0.075, 0.025], [0.15, 0.8, 0.05],[0.25, 0.25, 0.5]]; 经过k(30)步完成马尔科夫链转化过程。
要求完成转化过程计算并将其过程与结果用图形表示。如图1,两个初始状态的不同的三个初始值,经过相同的状态转移矩阵完成马尔科夫链转化后,不仅数值本身收敛,而且两组收敛值趋于相同。在这里插入图片描述
2、代码实现

import numpy as np
import pylab as pl
p01= np.array([0.5, 0.2, 0.3]) #p0数据 1,矩阵中每一行概率之和总等于1
p02=np.array([0.1,0.4,0.5]) #p0数据 2, 两个初始状态,用于分别计算和画图
p= np.array([[0.9, 0.075, 0.025], [0.15, 0.8, 0.05],[0.25, 0.25, 0.5]])
n=30
c= np.array(['r','g','b'])        #定义画图颜色数组
def calanddraw(p0,p ):#2 计算并画图函数
  for i in range(n):#3 
     p0= np.mat(p0) * np.mat(p)        #迭代变量 确定p0与p 的关系
     for j in range(len(np.array(p0)[0])):
          pl.scatter(i,p0[0,j], c = c[j], s=.5)#确定画点属性
pl.subplot(121)
calanddraw(p01,p)#调用数据画图
pl.subplot(122)
calanddraw(p02,p)#调用数据画图
pl.show()

3、运行结果
在这里插入图片描述

以上就是本文所有内容,希望能帮到大家!!!

马尔科夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)是一种用于估计复杂概率分布的方法。它通过模拟马尔科夫链的转移过程来生成样本,并利用这些样本来估计概率分布的性质。下面是一个简单的Python代码示例,用于求解马尔科夫链蒙特卡洛的转移概率: ```python import numpy as np def markov_chain_monte_carlo(transition_matrix, initial_state, num_steps): num_states = len(transition_matrix) current_state = initial_state states = [current_state] for _ in range(num_steps): current_state = np.random.choice(range(num_states), p=transition_matrix[current_state]) states.append(current_state) return states # 定义转移概率矩阵 transition_matrix = np.array([[0.2, 0.8], [0.6, 0.4]]) # 定义初始状态 initial_state = 0 # 模拟100个步骤的马尔科夫链 num_steps = 100 states = markov_chain_monte_carlo(transition_matrix, initial_state, num_steps) # 打印转移概率 transition_counts = np.zeros_like(transition_matrix) for i in range(len(states) - 1): current_state = states[i] next_state = states[i + 1] transition_counts[current_state][next_state] += 1 transition_probabilities = transition_counts / np.sum(transition_counts, axis=1, keepdims=True) print("转移概率矩阵:") print(transition_probabilities) ``` 这段代码中,`transition_matrix`表示马尔科夫链转移概率矩阵,`initial_state`表示初始状态,`num_steps`表示模拟的步骤数。`markov_chain_monte_carlo`函数模拟了马尔科夫链的转移过程,并返回每个步骤的状态。最后,根据模拟得到的状态序列,计算转移概率矩阵并打印出来。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值