問題:ある街にはA紙、B紙の新聞しかない。
- A紙の読者は翌月、5%がB紙に乗り換え、5%が購読をやめる。
- B紙の読者は翌月、3%がA紙に乗り換え、7%が購読をやめる。
- いずれも読んでいない人は翌月、3%がA紙の購読を開始し、4%がB紙の購読を始める。
A,B両紙のシェアはどの程度か?
A紙読者をx人、B紙読者をy人、いずれも読んでいない人をz人とすると、翌月のx,y,zは
と書けるはずだ。
行列部分Mをじっと見れば、M = P
-1APとなるような行列A、Pが見つかる。(嘘。芝浦工大・横田 壽先生:
行列の対角化を参照のこと)
M
n = (P
-1AP)
n = P
-1APP
-1APP
-1AP..... = P
-1A
nPなので
つまり、どんなx,y,zの組み合わせから始めても、月日が経つ(nが大きくなる)につれて、A紙23%、B紙30%、読んでいない人47%に収束していく。
いつも収束するとは限らないが、どのような初期値でも収束するならエルゴード(ergodic)的というらしい。
統計ソフトRを使えば、面倒なことはやってもらえる。
> M <- matrix(c(0.9,0.05,0.05,0.03,0.9,0.07,0.03,0.04,0.93),3,3)
> M
[,1] [,2] [,3]
[1,] 0.90 0.03 0.03
[2,] 0.05 0.90 0.04
[3,] 0.05 0.07 0.93
> y <- eigen(M)
> y
$values
[1] 1.00 0.87 0.86
$vectors
[,1] [,2] [,3]
[1,] 0.3831823 0.4082483 1.564989e-14
[2,] 0.5017864 0.4082483 -7.071068e-01
[3,] 0.7754881 -0.8164966 7.071068e-01
> A <- diag(y$values)
> A
[,1] [,2] [,3]
[1,] 1 0.00 0.00
[2,] 0 0.87 0.00
[3,] 0 0.00 0.86
> P <- t(y$vectors)
> P
[,1] [,2] [,3]
[1,] 3.831823e-01 0.5017864 0.7754881
[2,] 4.082483e-01 0.4082483 -0.8164966
[3,] 1.564989e-14 -0.7071068 0.7071068
> m <- t(solve(P) %*% diag((y$values)^1000 ) %*% P)
> m
[,1] [,2] [,3]
[1,] 0.2307692 0.2307692 0.2307692
[2,] 0.3021978 0.3021978 0.3021978
[3,] 0.4670330 0.4670330 0.4670330
# とはいえ、無理矢理計算しても一瞬だ(%*%は行列のかけ算演算子)
> M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M %*% M
[,1] [,2] [,3]
[1,] 0.2463502 0.2260949 0.2260949
[2,] 0.3020781 0.3111308 0.2964768
[3,] 0.4515717 0.4627743 0.4774283
冷静に考えれば、固有値・逆行列経由より、力づくのほうが、計算量も少ない。
では、先に収束する値(シェア)が与えられたとき、最初の問題の数値はどのようなものだったと想定されるのか。(3次元から6次元を一意に決めることは無理だろうけど)