【问题标题】:Speeding up a series of calculations across a large matrix in R加速 R 中大型矩阵的一系列计算
【发布时间】:2019-08-10 10:58:21
【问题描述】:

有任何建议,以编程或数学方式,以加快 R 中的计算速度吗?我已经包含了一些与我正在使用的真实数据场景非常匹配的生成数据。我还尝试使用 apply 和 parApply 并尝试将其转换为稀疏矩阵,因为它有很多 0,但到目前为止,这是我想出的最快的方法。有什么建议可以让它更快吗?我需要进行 10,000 次这样的计算。

与我的场景非常匹配的数据:

set.seed(7)
# same size matrix as my real data data puzzle
A <- matrix(rbeta((13163*13163),1,1), ncol = 13163, nrow = 13163)

# turn a bunch to 0 to more closely match that I have a lot of 0's in real data
A[A < 0.5] <- 0

# create binary matrix
z <- matrix(rbinom((13163*13163), 1, 0.25), ncol = 13163, nrow = 13163)

我发现 Rfast::rowsums 给我的结果最快。

start1 <- Sys.time()
testA <- 1 - exp(Rfast::rowsums(log(1-A*z)))
stop1 <- Sys.time()
stop1 - start1

请原谅我笨拙的基准测试方法...

【问题讨论】:

  • 您提供的矩阵是一列矩阵。你确定这是你拥有的吗?
  • microbenchmark 非常非常易于使用(比 Python 中烦人的 timeit 模块要容易得多,但我离题了)。没有理由笨拙。
  • 谢谢@F.Privé。我修正了那个错字并问了同样的问题,但结果略有不同(稀疏矩阵从来没有更快)。

标签: r performance math matrix


【解决方案1】:

你可以摆脱exp()log()

testB <- 1 - Rfast::rowprods(1-A*z)

这快了 8 倍。

然而,当你将 0 和 1 之间的许多数相乘时,你最终会得到到处都是 0,所以输出向量全是 1..

【讨论】:

  • 谢谢!我只是在学习 Rfast 包。但是,您是对的,这个下溢问题是我使用 exp-sum-log 方法的原因。
  • 我回答了你的问题还是你期待别的什么?
  • 不,我仍在尝试确定是否可以在没有下溢问题的情况下更快地完成此操作。
  • Rfast::rowprods 有一个方法参数用于选择比 R 更快的 exp-sum 方法。
猜你喜欢
  • 2014-07-17
  • 2018-11-23
  • 2021-10-26
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多