随机矩阵平稳分布

时间:2014-03-31 22:15:14

标签: r matrix-inverse

我有一个大的右边随机矩阵(行总和为1).size~20000x20000。我怎样才能找到它的静止分布?

我试图计算特征值和向量,并得到复杂的特征值,例如1 + 0i(多于一个)。

尝试使用以下方法:

pi=u[I-P+U]^-1

当我使用solve()进行反转时,收到错误消息Error in solve.default(A):system is computationally singular: reciprocal condition number = 3.16663e-19

据我所知,Perron-Frobenius定理确保每个随机矩阵作为一个固定概率向量pi,即特征值的最大绝对值始终为1,所以pi = piP,并且我的矩阵具有所有正条目,我能得到一个unq pi,我是对的吗? 或者,如果有任何方法,我可以计算行向量pi?

1 个答案:

答案 0 :(得分:1)

  1. 每个随机矩阵确实具有静态分布。由于P的所有行总和= 1, (P-1)具有行和= 0 =&gt; (P-I)*(1,....,1)总是给你零。因此秩(P-I)<= n-1,因此是转置到P-I的等级。因此,存在q使得(t(P)-I)* q = 0 =&gt; t(P)q = q。

  2. 复杂值1 + 0i似乎对我来说非常真实。但是如果你只得到复数值,即在i不为0之前的系数,那么算法会在某处产生错误 - 它以数字方式解决问题,而不是一直都是真的。此外,它产生多少特征值和向量并不重要,重要的是它找到了特征值1的正确特征向量,这就是你需要的东西。

  3. 确保您的固定分布确实是您的限制分布,否则计算它是没有意义的。您可以尝试通过将不同的向量乘以矩阵^ 1000来找出它,但我不知道在您的情况下将花费多少时间。

  4. 最后但并非最不重要的,这是一个例子:


  5. # first we need a function that calculates matrix^n
    mpot = function (A, p) {
      # calculates A^p (matrix multiplied p times with itself)
      # inputes: A - real-valued square matrix, p - natural number.  
      # output:  A^p
    
      B = A
      if (p>1) 
        for (i in 2:p) 
          B = B%*%A 
      return (B)
    }
    
    
    # example matrix
    P = matrix( nrow = 3, ncol = 3, byrow = T, 
                data = c(
                  0.1, 0.9, 0,   
                  0.4, 0,   0.6,
                  0,   1,   0
                )
    )
    
    
    # this converges to stationary distribution independent of start distribution
    t(mpot(P,1000)) %*% c(1/3, 1/3, 1/3)
    t(mpot(P,1000)) %*% c(1, 0, 0)
    
    # is it stationary? 
    xx = t(mpot(P,1000)) %*% c(1, 0, 0)
    t(P) %*% xx
    
    # find stationary distribution using eigenvalues
    eigen(t(P)) # here it is!
    eigen_vect = eigen(t(P))$vectors[,1]
    stat_dist = eigen_vect/sum(eigen_vect) # as there is subspace of them, 
                                           # but we need the one with sum = 1
    stat_dist