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

为什么你首先制作矩阵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

编辑: Linex <- t/max(t)似乎会导致不需要的行为,即您不应该将向量除以t最大值,因为这会使您的结果矩阵奇异。

于 2013-02-26T20:37:35.820 回答
1

您不能在mat. 试试这个:

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

您可以用 's 填充矩阵,runif然后迭代 Sinkhorn-Knopf 算法(例如,在http://www.cerfacs.fr/algor/reports/2006/TR_PA_06_42.ps.gz的第 3 页顶部描述)将收敛到一个双重随机(马尔可夫)矩阵。

于 2013-02-26T20:48:30.657 回答