2014-01-17 9 views
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 

는 그 후 나는 R eigen 기능

ew <- eigen(stoma) 

를 사용하지만 결과를 이해 해달라고

> 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"을가집니다. 시드를 변경해도 다른 숫자를 그리기 위해 동일한 값을 다시 얻습니다. 나는 무엇을 놓치나요? 왜 eigenvector의 성분들은 모두 eqaul인가? 왜 그들은 1까지 합계하지 않는가? 이것은 고정 분배 일 것이기 때문에?

도움 주셔서 감사합니다.

+0

과 같은 대답을 제공 – Qbik

답변

4

왼쪽 및 오른쪽 고유 벡터 사이에 혼동이 있습니다. eigen(t(stoma))을 시도해보십시오.

rowSums(p) 
## [1] 1 1 1 1 1 

고유 값 :

zapsmall(eigen(p)$values) 
## [1] 1.0000000 0.7071068 -0.7071068 0.0000000 0.0000000 

고유 벡터 :

는 확률 매트릭스의 확인

p <- matrix(c(0,0,1/4,0,0,0,0,1/4,0,0, 
     1/2,1,0,1/2,0,0,0,1/4,0,0,1/2,0,1/4,1/2,1), 
    ncol=5) 
p 
    [,1] [,2] [,3] [,4] [,5] 
## [1,] 0.00 0.00 0.5 0.00 0.50 
## [2,] 0.00 0.00 1.0 0.00 0.00 
## [3,] 0.25 0.25 0.0 0.25 0.25 
## [4,] 0.00 0.00 0.5 0.00 0.50 
## [5,] 0.00 0.00 0.0 0.00 1.00 

:

나는 것이 유용 wikipedia article on stochastic matrices에서 예제를 사용해 발견

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 

(결과는 귀하의 것이지만 임의로 뒤집은 부호는 뒤집습니다. R은 각 열의 제곱의 합이 1 : sqrt(1/5)이되도록 고유 벡터를 조정합니다. ? 0.447 ...)

당신은 다른 (왼쪽) 고유 벡터를 찾고 :

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 
+0

감사합니다! 왼쪽 및 오른쪽 고유 벡터의 차이를 알지 못했습니다. – Drey

3

고정 분포 (일명, 정상 상태)을 가장 쉽게 markovchain 패키지와 함께 계산됩니다.

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

이이 기간의 수는 다음 행렬 단수 당신에게 상관 행렬의 크기가 작은 경우

ev <- eigen(t(stoma)) 
ev$vectors[, 1]/sum(ev$vectors[, 1]) 
+0

감사합니다. Ben의 글에서 알 수있는 한, 전치 행렬에 대한 고유 벡터를 찾아야했습니다. 작은 보정을 덧붙이면 :'re (ev $ vectors [, 1]/sum (ev $ vectors [, 1]))'합계로 정규화 할 필요가 있습니다. – Drey

+0

@Drey : 잘 보입니다. 지금 고쳤다. –