将给定矩阵中所有列的每个 "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
下面给出了一个矩阵示例:
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
.
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