我有一个矩阵垫,其值介于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
这不是我想要的。我要求每个元素都有不同的值,但我不知道如何做到这一点。任何建议表示赞赏!
答案 0 :(得分: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
除以最大值,因为这会使得结果矩阵变为单数。
答案 1 :(得分:1)
mat
中不能有对称矩阵。试试这个:
n <- 10
mat <- matrix(runif(n**2),n)
mat <- mat/rowSums(mat)
答案 2 :(得分:1)
你可以用runif
填充矩阵然后迭代Sinkhorn-Knopf算法(例如,在http://www.cerfacs.fr/algor/reports/2006/TR_PA_06_42.ps.gz的第3页的顶部描述)将收敛到双随机(Markov)基质