将给定矩阵中所有列的每个 "path" 的值相乘

Multiply values of each "path" in a given matrix for all columns

下面给出了一个矩阵示例:

index 1 2 3 4 5 6 7 8 9 10
1 0.1 0.1 0.1 0.2 0.2 0.2 0.7 0.7 0.4 0.7
2 0.6 0.6 0.6 0.1 0.1 0.1 0.1 0.1 0.5 0.1
3 0.3 0.3 0.3 0.7 0.7 0.7 0.2 0.2 0.1 0.2

我想乘以所有可能的组合,从每列中选择一个值乘以该行 例如:

0.1* 0.1* 0.1* 0.2* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

0.1* 0.6* 0.1* 0.2* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

0.1* 0.3* 0.1* 0.2* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

0.1* 0.1* 0.6* 0.2* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

0.1* 0.1* 0.3* 0.2* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

0.1* 0.1* 0.1* 0.1* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

0.1* 0.1* 0.1* 0.7* 0.2* 0.2* 0.7* 0.7* 0.4* 0.7

等等... 目的是求最大值,得到每10列选择的行索引

我考虑将所有可能的组合创建成一行,然后对每一行执行行乘法(这将是一个组合)然后使用最大值。

如何创建一个矩阵,将所有可能的“路径”排成一行,但这样就很难确定最大值对应的“路径”。

要进行每个排列,我让您的数据为 dummy,请使用 expand.grid

grid <- expand.grid(rep(list(1:3), 10))

因为grid很大,我会用grid的前五个

grid <- grid[c(1:5),]

让我们定义一个函数来提取 dummy.

的网格 rownumberd(?) 值
func <- function(df, idx) {
  vec <- c()
  for (i in 1:length(idx)){
    vec[i] <- df[as.numeric(idx[i]),i]
  }
  vec
}

最后,将这些值相乘,例如

apply(grid, 1, function(x) prod(func(dummy, x)))

          1           2           3           4           5 
1.09760e-06 6.58560e-06 3.29280e-06 6.58560e-06 3.95136e-05

如果你想要最大化那是

grid[which.max(apply(grid, 1, function(x) prod(func(dummy, x)))),]
  Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
5    2    2    1    1    1    1    1    1    1     1

这是第二种方式

HOWEVER 我认为这种方式获得最大值及其索引的效率要高得多。因为所有元素都是正数,

x <- apply(dummy, 2, function(x) which.max(x))
 X1  X2  X3  X4  X5  X6  X7  X8  X9 X10 
  2   2   2   3   3   3   1   1   2   1 

prod(func(dummy,x))

[1] 0.01270609

第二种方式的大尺寸示例

microbenchmark::microbenchmark(test ={x <- runif(250000,0,1)
                               y <- matrix(x, nrow = 5)
                               xx <- apply(y, 2, function(x) which.max(x))
                               
                               prod(func(y,xx))}
)
Unit: milliseconds
 expr     min       lq     mean  median       uq      max neval
 test 86.0542 91.41575 111.9721 96.9571 140.7912 171.8394   100