在哪种情况下,用C ++编写一部分R代码或将其并行化(在R或Rcpp中)最有效? [关闭]

问题描述 投票:0回答:1
我有一些具有特殊结构的数据,需要我编写自己的k-means函数。在此不远处,在计算中心到所有数据点的距离时,我已经注意到非常高的计算时间。因为将来我的数据将增加约60倍,并且我需要使用许多不同的群集大小进行运行,所以我非常关心速度。

我附带了一个最小示例,用于计算从一个随机采样的中心到每个数据点的距离。我还没有在R中使用C ++或并行计算的经验,但是我最不确定这些解决方案中的哪一个是解决我的问题的最佳方法(在这里和那里有人声称您应该在任何时候进行并行化,有人声称几乎没有必要并行化) ,一些建议,一些反对使用Rcpp的建议)。与生活中的大多数事情一样,我确信在某些情况下所有这些答案都是正确的。但是,什么情况下通常采用哪种方法?

((我分析了此代码,仅在R代码中找不到我可以提高的速度。但是,如果您有任何建议,也请让我知道!)

x <- matrix(runif(15000*34),nrow = 15000, ncol = 34) w <- matrix(runif(15000*17),nrow = 15000, ncol = 17) k <- 3 i <- 1 centers <- x[sample.int(nrow(x), size = k),] weighted_matching <- function(point,center,weight){ point <- matrix(point, ncol = 2, nrow = 17, byrow = T) center <- matrix(center, ncol = 2, nrow = 17, byrow = T) 1/sum(weight) * sum(weight * apply(point, 1, function(x,y) sqrt(sum((x-y)^2)), y = center)) } system.time( apply(x, 1, weighted_matching, weight = w, center = centers[i,]) )

r parallel-processing rcpp
1个回答
3
投票
在两种情况下,我用C ++代替R:

    重复大量元素(大型for循环)
  • 想减少内存占用
  • 在您的情况下,您已经在使用矢量化代码而不是循环,因此第一点不适用。

    然而,第二点可能是有益的;实际上,您正在计算(x-y)^2,它将创建两个新的临时向量。最好使用C ++重写此代码,以使用更少的内存,并可能使计算时间提高2-3倍。

    但是,当我通常听到“计算距离”时,我可能会去尝试使用矩阵计算(线性代数)来得出。

  • © www.soinside.com 2019 - 2024. All rights reserved.