【问题标题】:How to write a list of lower triangular matrices where the sum of all matches values are equal to one如何编写所有匹配值之和等于一的下三角矩阵列表
【发布时间】:2018-09-12 08:20:28
【问题描述】:

主要思想是如何生成每个匹配值之和为1 的矩阵。也就是说,我没有矩阵,但想根据这个条件生成它们。

我的目标是生成lower.tri 矩阵的列表。这里的主要技巧是如何生成所有这些矩阵,其中每个匹配元素的总和为1

例如,

w1 <- c(0,0.7,0.8,0.5,0.2,
        0,0,0.7,0.6,0.3,
        0,0,0,0.9,0.8,
        0,0,0,0,0.3,
        0,0,0,0,0)
w1 <- matrix(w1,5,5)

 w2 <- c(0,0.3,0.2,0.5,0.8,
         0,0,0.3,0.4,0.7,
         0,0,0,0.1,0.2,
         0,0,0,0,0.7,
         0,0,0,0,0)
 w2 <- matrix(w2,5,5) 

主要思想是:

w5 &lt;- 1 - (w1+w2+w3+w4)w1 &lt;- 1-w2w3 &lt;- 1- (w1+w2)。 w4 1- (w1+w2+w3).

在这里我们可以看到每个匹配值的总和是1

例如:

> w1
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.0  0.0  0.0  0.0    0
[2,]  0.7  0.0  0.0  0.0    0
[3,]  0.8  0.7  0.0  0.0    0
[4,]  0.5  0.6  0.9  0.0    0
[5,]  0.2  0.3  0.8  0.3    0
> w2
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.0  0.0  0.0  0.0    0
[2,]  0.3  0.0  0.0  0.0    0
[3,]  0.2  0.3  0.0  0.0    0
[4,]  0.5  0.4  0.1  0.0    0
[5,]  0.8  0.7  0.2  0.7    0

w1[2,1] = 0.7
w2[2,1]= 0.3

那么他们的总和 = 1。所有w1[k,j] + w2[k,j] 都一样。

问题:

如何生成5 矩阵,其中每个匹配值的总和为1。我在考虑lapply 但是,我真的无法理解这部分的想法。

例如,输出应该是 5 个矩阵的列表。例如,

> w1
         [,1] [,2] [,3] [,4] [,5]
    [1,]  0.0  0.0  0.0  0.0    0
    [2,]  0.5  0.0  0.0  0.0    0
    [3,]  0.6  0.6  0.0  0.0    0
    [4,]  0.5  0.6  0.7  0.0    0
    [5,]  0.2  0.2  0.2  0.3    0

    > w2
         [,1] [,2] [,3] [,4] [,5]
    [1,]  0.0  0.0  0.0  0.0    0
    [2,]  0.2  0.0  0.0  0.0    0
    [3,]  0.2  0.3  0.0  0.0    0
    [4,]  0.5  0.2  0.1  0.0    0
    [5,]  0.7  0.5  0.2  0.5    0

> w3
         [,1] [,2] [,3] [,4] [,5]
    [1,]  0.0  0.0  0.0  0.0    0
    [2,]  0.1  0.0  0.0  0.0    0
    [3,]  0.2  0.1  0.0  0.0    0
    [4,]  0.3  0.2  0.3  0.0    0
    [5,]  0.1  0.3  0.6  0.2    0

【问题讨论】:

  • 我认为这可能是stackoverflow.com/questions/24845909/…的副本
  • 抱歉不一样
  • replicate(5, replicate(10, rand_vect_cont(5, 1)), simplify = FALSE) 然后改成矩阵
  • 我已经编辑了我的问题。

标签: r


【解决方案1】:

假设您想要正数,您可以使用 Dirichlet 分布来生成总和为 1 的向量。例如,MCMCpack 库中的 rdirichlet 函数。然后你可以这样做:

library(MCMCpack)

nmatrices <- 3 # number of matrices
matrix_size <- 5
matrices <- replicate(nmatrices, matrix(0, ncol=matrix_size, nrow=matrix_size), 
                      simplify=FALSE)
for(i in seq_along(matrices)){
  matrices[[i]][lower.tri(matrices[[i]])] <- rdirichlet(1, rep(1,10))
}

结果:

> matrices
[[1]]
           [,1]       [,2]       [,3]       [,4] [,5]
[1,] 0.00000000 0.00000000 0.00000000 0.00000000    0
[2,] 0.15475899 0.00000000 0.00000000 0.00000000    0
[3,] 0.01094188 0.10190545 0.00000000 0.00000000    0
[4,] 0.18999179 0.08817135 0.06223413 0.00000000    0
[5,] 0.05055661 0.02846215 0.26253043 0.05044721    0

[[2]]
          [,1]       [,2]      [,3]       [,4] [,5]
[1,] 0.0000000 0.00000000 0.0000000 0.00000000    0
[2,] 0.1592983 0.00000000 0.0000000 0.00000000    0
[3,] 0.1277237 0.03365446 0.0000000 0.00000000    0
[4,] 0.0380273 0.07080578 0.0728188 0.00000000    0
[5,] 0.1745902 0.01504430 0.2400594 0.06797775    0

[[3]]
           [,1]       [,2]         [,3]       [,4] [,5]
[1,] 0.00000000 0.00000000 0.0000000000 0.00000000    0
[2,] 0.13537093 0.00000000 0.0000000000 0.00000000    0
[3,] 0.14060566 0.03186886 0.0000000000 0.00000000    0
[4,] 0.27152069 0.23647956 0.0008148619 0.00000000    0
[5,] 0.00176678 0.04141304 0.1052544582 0.03490516    0

编辑

我不明白这个问题。你可以这样做:

nmatrices <- 3 # number of matrices
matrix_size <- 4
matrices <- replicate(nmatrices, matrix(0, ncol=matrix_size, nrow=matrix_size), 
                      simplify=FALSE)
samples <- rdirichlet(matrix_size*(matrix_size-1)/2, rep(1,nmatrices))
for(m in seq_along(matrices)){
  for(k in seq_len(matrix_size*(matrix_size-1)/2)){
    matrices[[m]][lower.tri(matrices[[m]])][k] <- samples[k, m]
  }
}

结果:

> matrices
[[1]]
          [,1]      [,2]      [,3] [,4]
[1,] 0.0000000 0.0000000 0.0000000    0
[2,] 0.8444768 0.0000000 0.0000000    0
[3,] 0.0509210 0.2392519 0.0000000    0
[4,] 0.5588843 0.1921104 0.2482988    0

[[2]]
           [,1]      [,2]      [,3] [,4]
[1,] 0.00000000 0.0000000 0.0000000    0
[2,] 0.03179142 0.0000000 0.0000000    0
[3,] 0.49615251 0.2485702 0.0000000    0
[4,] 0.03481287 0.1113190 0.7224681    0

[[3]]
          [,1]      [,2]       [,3] [,4]
[1,] 0.0000000 0.0000000 0.00000000    0
[2,] 0.1237318 0.0000000 0.00000000    0
[3,] 0.4529265 0.5121779 0.00000000    0
[4,] 0.4063028 0.6965705 0.02923302    0

【讨论】:

  • 总和不等于1
  • @F.AMER 是的。检查lapply(matrices, sum)
  • @F.AMER 哦,抱歉,您不希望 each 矩阵的 all 条目总和为 1 吗?然后我没看懂这个问题。
  • @F.AMER 查看我的编辑。我现在知道了。没错。
  • 非常感谢。是的。这就是我想要的。
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多