一个简单的马尔可夫过程例子
来源:互联网 发布:python ui开发 编辑:程序博客网 时间:2024/06/03 13:29
什么是马尔可夫过程(Markov Process)
要说什么是马尔可夫过程,首先必须讲讲什么是随机过程(Stochastic Process)。
設
(Ω,,P) 為一概率空間,另設集合T 為一指標集合。如果對於所有t∈T ,均有一隨機變量ξt(ω) 定義於概率空間(Ω,,P) ,則集合{ξt(ω)|t∈T} 為一隨機過程。—Wikipedia
其实简单来说,随机过程就是对一连串随机变量(或事件)变迁或者说动态关系的描述。
马尔可夫过程其实就是随机过程的一种:
A stochastic process
where
换句话说,马尔可夫过程说的就是在随机过程中,明天的状态只取决于今天的状态而和今天之前的状态无关。也就是不管你是怎样达到
我们经常还会看到马尔可夫链。其实马尔可夫链就是状态空间为可数集的马尔可夫过程:
Let
转移矩阵(Transition Matrix)
既然当知道
稳态(steady-state)
首先我们先定义一个横向量
假设我们今天的状态是A而不是B,那么我们明天是A还是B的可能性为:
后天是A还是B的可能性为:
大后天是A还是B的可能性为:
那么会不会某一时刻后我们的横向量
这么繁杂的工作还是要我们的小奴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
得出的结果为:
让我们换一个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
得出的结果仍然为:
其实仔细观察一下就可以看出这个
既然知道
%%%%%Eigenvector%%%%%[n,v]=eig(P');ppi=n(:,1);scale=sum(ppi); %ensure the summation of the distribution vector pi is 1ppi=ppi/scale;
得出的结果绝对是当然地为:
一个简单的模型
假设我们在研究一个粒子的运动。这个粒子随机地在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));endfor 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;endfor 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>1AA=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));endfor i=1:length(indxB); a2(1,indxB(1,i))=B(1,indxB(1,i));endindxA=find(a2==-1);indxB=find(a2==2);for i=1:length(indxA); a2(1,indxA(1,i))=1;endfor i=1:length(indxB); a2(1,indxB(1,i))=0;enda=a2;j=j-1;endsum(a2)
得出的结果大概在60000左右。也就是说大概能观察到60000个粒子在A门,40000个在B门。
正如前面得出的
- 一个简单的马尔可夫过程例子
- 一个简单的过程+作业例子
- 一个简单的存储过程使用事务的例子
- 一个简单的mysql存储过程的例子
- SQL2000 存储过程中实现递归的一个简单例子
- C#用存储过程的一个简单例子
- 如何使用Oracle存储过程的一个简单例子
- 【JAVA基础】0011--------ORACLE存储过程的一个简单例子
- 一个简单的例子
- 简单的存储过程例子
- 简单的存储过程例子
- 简单的存储过程例子
- 一个存储过程的例子
- 一个过程模型的例子
- 一个存储过程的例子
- 存储过程的一个例子
- 存储过程的一个例子
- openmp 例子:一个简单的OpenMP例子
- [LeetCode160]Longest Substring with At Most Two Distinct Characters
- 强大数定理
- [LeetCode161] One Edit Distance
- [LeetCode163]Missing Ranges
- [LeetCode167]Two Sum II - Input array is sorted
- 一个简单的马尔可夫过程例子
- Volley源码解析
- B-树和B+树的应用:数据搜索和数据库索引【转】
- S3C6410的tv out输出lcd的内容
- [LeetCode170]Two Sum III - Data structure design
- [LeetCode186]Reverse Words in a String II
- [LeetCode243]Shortest Word Distance
- [LeetCode244]Shortest Word Distance II
- [LeetCode245] Shortest Word Distance III