Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
马尔可夫转移概率矩阵在Python中的实现_Python_Numpy_Matrix_Scipy_Markov - Fatal编程技术网

马尔可夫转移概率矩阵在Python中的实现

马尔可夫转移概率矩阵在Python中的实现,python,numpy,matrix,scipy,markov,Python,Numpy,Matrix,Scipy,Markov,我试图计算序列的一步、两步转移概率矩阵,如下所示: sample = [1,1,2,2,1,3,2,1,2,3,1,2,3,1,2,3,1,2,1,2] import numpy as np def onestep_transition_matrix(transitions): n = 3 #number of states M = [[0]*n for _ in range(n)] for (i,j) in zip(transitions,transitions[

我试图计算序列的一步、两步转移概率矩阵,如下所示:

sample = [1,1,2,2,1,3,2,1,2,3,1,2,3,1,2,3,1,2,1,2]
import numpy as np

def onestep_transition_matrix(transitions):
    n = 3 #number of states

    M = [[0]*n for _ in range(n)]

    for (i,j) in zip(transitions,transitions[1:]):
        M[i-1][j-1] += 1

    #now convert to probabilities:
    for row in M:
        s = sum(row)
        if s > 0:
            row[:] = [f/s for f in row]
    return M

one_step_array = np.array(onestep_transition_matrix(sample))
我的问题是,我们如何计算两步转移矩阵。因为当我手动计算矩阵时,它如下所示:

two_step_array = array([[1/7,3/7,3/7],
                       [4/7,2/7,1/7],
                       [1/4,3/4,0]])
不过。np.dot(一步数组,一步数组)给出了一个不同的结果,如下所示:

array([[0.43080357, 0.23214286, 0.33705357],
   [0.43622449, 0.44897959, 0.11479592],
   [0.20089286, 0.59821429, 0.20089286]])

请告诉我哪一个是正确的

您只需更改for循环中的转换索引:

def twostep_transition_matrix(transitions):
    n = 3 #number of states

    M = [[0]*n for _ in range(n)]

    for (i,j) in zip(transitions,transitions[2:]):
        M[i-1][j-1] += 1

    #now convert to probabilities:
    for row in M:
        s = sum(row)
        if s > 0:
            row[:] = [f/s for f in row]
    return M

这意味着两步转移矩阵和矩阵幂2不同。我的理解正确吗?是的,两者都不相同。区别在于上面是实际的两步传递矩阵,而幂是基于一步传递矩阵的两步传递矩阵的估计。由于样本量如此之小,即使您的马尔可夫过程没有记忆,估计值和实际值也不太可能相同。@ErnestSKirubakaran,这一行的原因是什么?为什么我们不能直接分配到
?很抱歉,我是python新手。@在for循环中标记,
是指矩阵m中特定行的对象。如果我们给行[:]=[f/s表示行中的f],该行的引用将从m中的对应行更改为新行
[f/s表示行中的f]
。但M中的原始行不会更改。如果我们想更改M中的行,我们需要给出
row[:]=[f/s表示行中的f]