1

私は次のように0から1の間の値を持つマトリックスマットを持っています(確率である可能性があります):

> t <- c(22, 65, 37, 84, 36, 14, 9, 19, 5, 49)
> x <- t/max(t)
> mat <- x%*%t(x)

ここで、この行列bをマルコフ遷移行列に変換します。つまり、各行の要素を合計して1にします。これは、行列をrowSumsで除算することによって実現します。

> y <- mat/rowSums(mat)
> z <- y/rowSums(y)
> rowSums(z)
  [1] 1 1 1 1 1 1 1 1 1 1

ただし、これにより、各列の要素の値は同じになります。

           [,1]      [,2]      [,3]      [,4]      [,5]
 [1,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 
 [2,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 
 [3,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 
 [4,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 

これは私が望むものではありません。各要素に異なる値を設定する必要がありますが、これを行う方法がわかりません。どんな提案もありがたいです!

4

3 に答える 3

1

行列を で埋めてからrunif、Sinkhorn-Knopf アルゴリズムを繰り返すことができます (たとえば、http: //www.cerfacs.fr/algor/reports/2006/TR_PA_06_42.ps.gz の 3 ページの上部に記載されています) 。二重確率 (マルコフ) 行列に収束します。

于 2013-02-26T20:48:30.657 に答える
1

なぜ最初にマトリックスyを作成し、次にを作成するのzですか?

rowSums で割るというあなたの考えは正しいですが、これが機能するため、問題は元のマトリックスにあると思います。

mat<-matrix(runif(100),10,10)
mat2<-mat/rowSums(mat)
rowSums(mat2)
 [1] 1 1 1 1 1 1 1 1 1 1

編集:行x <- t/max(t)は望ましくない動作を引き起こすようです。つまりt、結果の行列が特異になるため、ベクトルを最大値で除算しないでください。

于 2013-02-26T20:37:35.820 に答える
1

に simetric 行列を含めることはできませんmat。これを試して:

n <- 10
mat <- matrix(runif(n**2),n)
mat <- mat/rowSums(mat)
于 2013-02-26T20:39:29.343 に答える