【问题标题】:Converting a matrix into a markov transition matrix in R在R中将矩阵转换为马尔可夫转换矩阵
【发布时间】:2013-02-12 11:00:50
【问题描述】:

我有一个值介于 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 

这不是我想要的。我要求每个元素具有不同的值,但我不知道如何做到这一点。任何建议表示赞赏!

【问题讨论】:

    标签: r markov-chains


    【解决方案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 &lt;- t/max(t) 行似乎会导致不需要的行为,即您不应将向量 t 与最大值分开,因为这会使您的结果矩阵奇异。

    【讨论】:

      【解决方案2】:

      mat 中不能有 simetric 矩阵。试试这个:

      n <- 10
      mat <- matrix(runif(n**2),n)
      mat <- mat/rowSums(mat)
      

      【讨论】:

      • 你可以有对称矩阵。测试垫
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 2018-03-21
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多