【发布时间】:2020-04-24 07:45:36
【问题描述】:
我正在尝试做的极简主义示例:
dX_i <- rnorm(100, 0, 0.0002540362)
p_vec <- seq(0, 1, 0.25)
gamma_vec <- seq(1, 2, 0.25)
a_vec <- seq(2, 6, 1)
sigma_hat_vec <- c(0.03201636, 0.05771143, 0.07932116, 0.12262327, 0.15074560)
delta_j_vec <- c(0.0000005850109, 0.0000011700217, 0.0000017550326, 0.0000035100651, 0.0000052650977)
parameters <- expand.grid("p" = p_vec, "gamma" = gamma_vec, "a" = a_vec, "sigma_hat" = sigma_hat_vec, "delta_j" = delta_j_vec)
result <- sapply(1:nrow(parameters), function(x) {
tmp <- parameters[x,]
p <- tmp$p
a <- tmp$a
gamma <- tmp$gamma
sigma_hat <- tmp$sigma_hat
delta_j <- tmp$delta_j
B <- sum( (abs(dX_i)^p) * ( abs(dX_i) < gamma * a * sigma_hat * delta_j^(1/2) ))
return(B)
})
目标:在给定 p、a、gamma、sigma_hat、delta_j 的所有组合的情况下,我需要在向量 dX 上计算 B。
然而,实际上网格 parameters 有大约 600k 行,dX_i 有大约 80k 行。此外,我有一个 ~1000 dX_i 的列表。因此,我想让这个计算尽可能高效。其他方法,例如将parameters 转换为data.table 并在该data.table 中运行sapply 似乎并没有加快速度。
我尝试将函数并行化(我仅限于在虚拟 Windows 机器上运行脚本):
cl <- makePSOCKcluster(numCores)
num.iter <- 1:nrow(parameters)
parSapply(cl, num.iter, function(x, parameters, dX_i) {
tmp <- parameters[x,]
p <- tmp$p
a <- tmp$a
gamma <- tmp$gamma
sigma_hat <- tmp$sigma_hat
delta_j <- tmp$delta_j
sum( (abs(dX_i)^p) * ( abs(dX_i) < gamma * a * sigma_hat * delta_j^(1/2) ))
}, parameters, dX_i)
stopCluster(cl)
虽然这让我加快了速度,但我仍然觉得我并没有真正以最有效的方式解决这个问题,如果有任何建议,我将不胜感激。
【问题讨论】:
-
也许使用贝赛搜索?
-
只是好奇,它目前有多快以及“足够快”有多快?
-
你有充分的理由计算这么多项吗?
-
你真的需要every组合吗?你的目标是什么?如果您正在寻找最小值或最大值,请考虑改用优化器,这将能够实现比网格搜索更智能/更有效的搜索模式。例如,
optim或optimx包。 -
@YalDan 回答 Jon 的问题是一个好的开始,但我认为他所要求的澄清的很大一部分是您需要它多快? 2倍加速好吗? 10 倍? 100 倍?
标签: r performance loops optimization