一个简单的马尔可夫过程例子

本文介绍了马尔可夫过程的基本概念,包括随机过程、马尔可夫过程、马尔可夫链及其转移矩阵,并通过实例展示了如何求解稳态分布。
部署运行你感兴趣的模型镜像

什么是马尔可夫过程(Markov Process)

要说什么是马尔可夫过程,首先必须讲讲什么是随机过程(Stochastic Process)。

(Ω,,P)為一概率空間,另設集合T為一指標集合。如果對於所有tT,均有一隨機變量ξt(ω)定義於概率空間(Ω,,P),則集合{ξt(ω)|tT}為一隨機過程。—Wikipedia

其实简单来说,随机过程就是对一连串随机变量(或事件)变迁或者说动态关系的描述。

马尔可夫过程其实就是随机过程的一种:

A stochastic process st:tN is said to be Markov if

prob(st+1|st)=prob(st+1|st)

where st is the history up to period t and st is the realization of the state at period t.

换句话说,马尔可夫过程说的就是在随机过程中,明天的状态只取决于今天的状态而和今天之前的状态无关。也就是不管你是怎样达到 st 的,只要你今天的状态是 st, 你明天状态的可能性就决定好了。

我们经常还会看到马尔可夫链。其实马尔可夫链就是状态空间为可数集的马尔可夫过程:

Let stS and if S is finite (countable), we call the Markov Process with this countable state space Markov Chain.


转移矩阵(Transition Matrix)

既然当知道 st 时我们就能知道 st+1 发生的概率,那么我们自然可以把有限可数的状态空间的转移法(transistion law)写成一个矩阵。举个例子,如果状态空间只包含了两个状态A和B。如果今天是A,那么明天还是A的概率为0.8。如果今日是B,那么明天还是B的概率为0.7。转移矩阵可写为:

P=0.8 0.30.20.7

稳态(steady-state)

首先我们先定义一个横向量π

πprob(A)prob(B)

假设我们今天的状态是A而不是B,那么我们明天是A还是B的可能性为:

10×0.8 0.30.20.7=0.80.2

后天是A还是B的可能性为:

0.80.2×0.8 0.30.20.7=0.70.3

大后天是A还是B的可能性为:

0.70.3×0.8 0.30.20.7=0.650.35

那么会不会某一时刻后我们的横向量π能到达一个不动点:

π×P=π

这么繁杂的工作还是要我们的小奴Matlab来完成吧。
%initial pi%
pi=[1,0];

%transistion matrix%
P=[0.8,0.2;0.3,0.7];

%critical value%
cv=1;

while cv>0.0000000001;
    pi2=pi*P;
    cv=abs(min(pi2-pi));
    pi=pi2;
end

得出的结果为:

π=0.60.4

让我们换一个initial pi来试试看:

%initial pi%
pi=[0.35,0.65];

%transistion matrix%
P=[0.8,0.2;0.3,0.7];

%critical value%
cv=1;

while cv>10e-06;
    pi2=pi*P;
    cv=abs(min(pi2-pi));
    pi=pi2;
end

得出的结果仍然为:

π=0.60.4

其实仔细观察一下就可以看出这个 π 其实是转移矩阵 P 的转置的对应特征值(Eigenvalue)等于1的特征向量(Eigenvector):

   π=πPπ(IP)=0(IP)π=0(PI)π=0

既然知道 π 其实是 P 的特征向量,我们就可以直接通过Matlab找特征向量而不必要用繁琐的迭代法啦。

%%%%%Eigenvector%%%%%
[n,v]=eig(P');
ppi=n(:,1);
scale=sum(ppi); %ensure the summation of the distribution vector pi is 1
ppi=ppi/scale;

得出的结果绝对是当然地为:

π=0.60.4

一个简单的模型

假设我们在研究一个粒子的运动。这个粒子随机地在A门与B门之间跳动。如果这个粒子跳入A门,那么它下一次跳入A门的概率为0.8。如果这个粒子跳入B门,那么它下次跳入B门的概率为0.7。我们的问题是,现在有100000个这样的粒子让它们跳跃,让它们跳跃1000次,我们会观察到多少个粒子在A门多少个在B门?

思路:

首先随机生成100000个粒子。1代表该粒子在A门,0代表在B门。

 size=100000;
 a=round(rand(1,size));

生成10000个以概率0.8为1,概率0.2为0的随机数。同时在生成10000个以概率0.7为0,概率0.3为1随机数。

 AA=rand(1,size)<=0.8;
 BB=rand(1,size)<=0.3;

用2a-AA。如果值为1说明该粒子从A门跳转到A门;如果值为2则说明该粒子从A门跳转到B门。另外值为0,-1则说明该粒子初始状态是在B门。

用2a-BB。如果值为0说明该粒子从B门跳转到B门;如果值为-1则说明该粒子从B门跳转到A门。另外值为2,1则说明该粒子初始状态是在A门。

A=2*a-AA;
B=2*a-BB;

找到A中大于等于1的元素与B中小于等于0的元素。同时新建一个向量a2用于存储结果。

indxA=find(A>=1);
indxB=find(B<=0);

a2=zeros(1,size);

将A中大于等于1的元素与B中小于等于0的元素按照对应的位置放入新的向量a中。

for i=1:length(indxA);
    a2(1,indxA(1,i))=A(1,indxA(1,i));
end

for i=1:length(indxB);
    a2(1,indxB(1,i))=B(1,indxB(1,i));
end

这时a2中1和-1代表粒子在A门;2和0代表粒子在B门。将-1换成1,2换成0。

indxA=find(a2==-1);
indxB=find(a2==2);

for i=1:length(indxA);
    a2(1,indxA(1,i))=1;
end

for i=1:length(indxB);
    a2(1,indxB(1,i))=0;
end

通过while loop让粒子跳跃1000次。

%%%%%Example%%%%%

%generate observations% 
size=100000;
a=round(rand(1,size)); %each column is one particle%

j=1000;
while j>1
AA=rand(1,size)<=0.8;
BB=rand(1,size)<=0.3;

A=2*a-AA;
B=2*a-BB;

indxA=find(A>=1);
indxB=find(B<=0);

a2=zeros(1,size);

for i=1:length(indxA);
    a2(1,indxA(1,i))=A(1,indxA(1,i));
end

for i=1:length(indxB);
    a2(1,indxB(1,i))=B(1,indxB(1,i));
end

indxA=find(a2==-1);
indxB=find(a2==2);

for i=1:length(indxA);
    a2(1,indxA(1,i))=1;
end

for i=1:length(indxB);
    a2(1,indxB(1,i))=0;
end

a=a2;
j=j-1;
end

sum(a2)

得出的结果大概在60000左右。也就是说大概能观察到60000个粒子在A门,40000个在B门。

正如前面得出的 π=0.60.4:粒子出现在A门的概率为0.6,出现在B门的概率为0.4。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值