R 计算随机矩阵的特征值/特征向量

R 计算随机矩阵的特征值/特征向量,r,eigenvector,eigenvalue,markov-models,R,Eigenvector,Eigenvalue,Markov Models,我很难确定马尔可夫模型的平稳分布。我开始理解这些理论和联系: 给定一个随机矩阵,为了刻画平稳分布,我们需要找到最大特征值(即1)的特征向量 我从生成一个随机矩阵开始 set.seed(6534) stoma <- matrix(abs(rnorm(25)), nrow=5, ncol=5) stoma <- (stoma)/rowSums(stoma) # that should make it a stochastic matrix rowSums(stoma) == 1 但是我

我很难确定马尔可夫模型的平稳分布。我开始理解这些理论和联系: 给定一个随机矩阵,为了刻画平稳分布,我们需要找到最大特征值(即1)的特征向量

我从生成一个随机矩阵开始

set.seed(6534)
stoma <- matrix(abs(rnorm(25)), nrow=5, ncol=5)
stoma <- (stoma)/rowSums(stoma) # that should make it a stochastic matrix rowSums(stoma) == 1
但是我不明白结果

> ew
$values
[1]  1.000000e+00+0.000000e+00i -6.038961e-02+0.000000e+00i -3.991160e-17+0.000000e+00i
[4] -1.900754e-17+1.345763e-17i -1.900754e-17-1.345763e-17i

$vectors
              [,1]           [,2]          [,3]                  [,4]                  [,5]
[1,] -0.4472136+0i  0.81018968+0i  0.3647755+0i -0.0112889+0.1658253i -0.0112889-0.1658253i
[2,] -0.4472136+0i  0.45927081+0i -0.7687393+0i  0.5314923-0.1790588i  0.5314923+0.1790588i
[3,] -0.4472136+0i  0.16233945+0i  0.2128250+0i -0.7093859+0.0000000i -0.7093859+0.0000000i
[4,] -0.4472136+0i -0.09217315+0i  0.4214660+0i -0.1305497-0.1261247i -0.1305497+0.1261247i
[5,] -0.4472136+0i -0.31275073+0i -0.2303272+0i  0.3197321+0.1393583i  0.3197321-0.1393583i
最大值(1)的向量具有所有相同的分量值“-0.4472136”。 即使我改变种子,画不同的数字,我也会得到相同的值。 我错过了什么?为什么特征向量的分量都相等?既然这应该是一个固定分布,为什么它们的总和不等于1


谢谢你的帮助

这是左右特征向量之间的混淆。尝试使用本征(t(气孔))

我发现尝试以下示例很有用:

特征值:

zapsmall(eigen(p)$values)
## [1]  1.0000000  0.7071068 -0.7071068  0.0000000  0.0000000
特征向量:

print(zapsmall(eigen(p)$vectors),digits=3)

##       [,1]  [,2]   [,3]   [,4]   [,5]
## [1,] 0.447 0.354  0.354 -0.802 -0.609
## [2,] 0.447 0.707  0.707  0.535 -0.167
## [3,] 0.447 0.500 -0.500  0.000  0.000
## [4,] 0.447 0.354  0.354  0.267  0.776
## [5,] 0.447 0.000  0.000  0.000  0.000
print(zapsmall(eigen(t(p))$vectors),digits=3)
##      [,1]   [,2]    [,3] [,4]   [,5]
## [1,]    0 -0.149  0.3011 -0.5  0.707
## [2,]    0 -0.149  0.3011  0.5  0.000
## [3,]    0 -0.422 -0.8517  0.0  0.000
## [4,]    0 -0.149  0.3011 -0.5 -0.707
## [5,]    1  0.869 -0.0517  0.5  0.000
(结果与您的结果相同,但符号任意翻转。R缩放特征向量,使每列的平方和为1:
sqrt(1/5)
约为0.447…)

您正在寻找其他(左?)特征向量:

print(zapsmall(eigen(p)$vectors),digits=3)

##       [,1]  [,2]   [,3]   [,4]   [,5]
## [1,] 0.447 0.354  0.354 -0.802 -0.609
## [2,] 0.447 0.707  0.707  0.535 -0.167
## [3,] 0.447 0.500 -0.500  0.000  0.000
## [4,] 0.447 0.354  0.354  0.267  0.776
## [5,] 0.447 0.000  0.000  0.000  0.000
print(zapsmall(eigen(t(p))$vectors),digits=3)
##      [,1]   [,2]    [,3] [,4]   [,5]
## [1,]    0 -0.149  0.3011 -0.5  0.707
## [2,]    0 -0.149  0.3011  0.5  0.000
## [3,]    0 -0.422 -0.8517  0.0  0.000
## [4,]    0 -0.149  0.3011 -0.5 -0.707
## [5,]    1  0.869 -0.0517  0.5  0.000

这是左右特征向量之间的混淆。尝试使用本征(t(气孔))

我发现尝试以下示例很有用:

特征值:

zapsmall(eigen(p)$values)
## [1]  1.0000000  0.7071068 -0.7071068  0.0000000  0.0000000
特征向量:

print(zapsmall(eigen(p)$vectors),digits=3)

##       [,1]  [,2]   [,3]   [,4]   [,5]
## [1,] 0.447 0.354  0.354 -0.802 -0.609
## [2,] 0.447 0.707  0.707  0.535 -0.167
## [3,] 0.447 0.500 -0.500  0.000  0.000
## [4,] 0.447 0.354  0.354  0.267  0.776
## [5,] 0.447 0.000  0.000  0.000  0.000
print(zapsmall(eigen(t(p))$vectors),digits=3)
##      [,1]   [,2]    [,3] [,4]   [,5]
## [1,]    0 -0.149  0.3011 -0.5  0.707
## [2,]    0 -0.149  0.3011  0.5  0.000
## [3,]    0 -0.422 -0.8517  0.0  0.000
## [4,]    0 -0.149  0.3011 -0.5 -0.707
## [5,]    1  0.869 -0.0517  0.5  0.000
(结果与您的结果相同,但符号任意翻转。R缩放特征向量,使每列的平方和为1:
sqrt(1/5)
约为0.447…)

您正在寻找其他(左?)特征向量:

print(zapsmall(eigen(p)$vectors),digits=3)

##       [,1]  [,2]   [,3]   [,4]   [,5]
## [1,] 0.447 0.354  0.354 -0.802 -0.609
## [2,] 0.447 0.707  0.707  0.535 -0.167
## [3,] 0.447 0.500 -0.500  0.000  0.000
## [4,] 0.447 0.354  0.354  0.267  0.776
## [5,] 0.447 0.000  0.000  0.000  0.000
print(zapsmall(eigen(t(p))$vectors),digits=3)
##      [,1]   [,2]    [,3] [,4]   [,5]
## [1,]    0 -0.149  0.3011 -0.5  0.707
## [2,]    0 -0.149  0.3011  0.5  0.000
## [3,]    0 -0.422 -0.8517  0.0  0.000
## [4,]    0 -0.149  0.3011 -0.5 -0.707
## [5,]    1  0.869 -0.0517  0.5  0.000

使用
markovchain
软件包最容易计算平稳分布(也称为稳态)

library(markovchain)
mc <- new("markovchain", transitionMatrix = stoma)
steadyStates(mc)
库(markovchain)

mc使用
markovchain
软件包最容易计算平稳分布(也称为稳态)

library(markovchain)
mc <- new("markovchain", transitionMatrix = stoma)
steadyStates(mc)
库(markovchain)

谢谢!我不知道左右特征向量之间的区别。谢谢!我不知道左右特征向量之间的区别。谢谢!据我从本的帖子中了解,我需要找到转置矩阵的特征向量。只需添加一个小的更正:
Re(ev$vectors[,1]/sum(ev$vectors[,1])
我们需要通过求和进行规范化。@Drey:很好地发现;现在修好了,谢谢!据我从本的帖子中了解,我需要找到转置矩阵的特征向量。只需添加一个小的更正:
Re(ev$vectors[,1]/sum(ev$vectors[,1])
我们需要通过求和进行规范化。@Drey:很好地发现;现在固定了。若相关矩阵的维数小于周期数,那个么矩阵是奇异的。若相关矩阵的维数小于周期数,那个么矩阵是奇异的