欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个马氏链模拟的遇到的小问题

程序员文章站 2022-07-10 23:26:44
...

一个马氏链模拟遇到的小问题

原本问题很简单,我们有转移矩阵为如下矩阵的马氏链:
123410.20.70.1020.050.10.050.83001040001\begin{aligned} &\begin{array}{ccccc} & 1 & 2 & 3 & 4 \\ 1 & 0.2 & 0.7 & 0.1 & 0 \\ 2 & 0.05 & 0.1 & 0.05 & 0.8\\ 3 & 0 & 0 &1 &0 \\ 4 & 0 & 0 &0 &1 \end{array} \end{aligned}

根据理论我们可以算出状态1最终被状态3吸收的概率是25137\frac{25}{137}。我顺便做了一个模拟:

M = 10000
np.random.seed(1234)
final_state = np.zeros(M)
for i in range(M):
    x = 1 # start from 1
    while(True):
        r =st.uniform.rvs()
        if(x==1):
            if(r<0.2):
                x = 1
            elif(r<0.9):
                x = 2
            else:
                x = 3
                break
        if(x==2):
            if(r<0.05):
                x = 1
            elif(r<0.15):
                x = 2
            elif(r<0.2):
                x = 3
                break
            else:
                x = 4
                break
    final_state[i] = x
p1 = np.sum(final_state==3)/M
print(p1)

但是这样得出的结论和理论不一致,重新看了一遍代码,发现我使用了同一个随机数来决定两种不同状态下一步的变化。我觉得可能是这里出了问题,所以更改如下

M = 10000
np.random.seed(1234)
final_state = np.zeros(M)
for i in range(M):
    x = 2# start from 1
    while(True):
        if(x==1):
            r =st.uniform.rvs()
            if(r<0.2):
                x = 1
            elif(r<0.9):
                x = 2
            else:
                x = 3
                break
        if(x==2):
            r =st.uniform.rvs()
            if(r<0.05):
                x = 1
            elif(r<0.15):
                x = 2
            elif(r<0.2):
                x = 3
                break
            else:
                x = 4
                break
    final_state[i] = x
p1 = np.sum(final_state==3)/M
print(p1)

这时我得到了正确的答案。

然而我现在的问题是,第一个版本的代码,**定义了怎样一个随机过程呢?**这种随机过程是否存在实际例子?

相关标签: 统计

上一篇: 数学

下一篇: 统计方形