我有一个大的右边随机矩阵(行总和为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?
答案 0 :(得分: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。
复杂值1 + 0i似乎对我来说非常真实。但是如果你只得到复数值,即在i不为0之前的系数,那么算法会在某处产生错误 - 它以数字方式解决问题,而不是一直都是真的。此外,它产生多少特征值和向量并不重要,重要的是它找到了特征值1的正确特征向量,这就是你需要的东西。
确保您的固定分布确实是您的限制分布,否则计算它是没有意义的。您可以尝试通过将不同的向量乘以矩阵^ 1000来找出它,但我不知道在您的情况下将花费多少时间。
最后但并非最不重要的,这是一个例子:
# 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