更有效的方法来计算R中的rowNorm?

问题描述 投票:1回答:1

我编写了一个使用无监督K均值算法的程序来尝试压缩图像。现在可以使用,但是与Python相比,它的运行速度慢得令人难以置信!具体来说,它是在查找rowNorms太慢了。数组X是350000个以上的元素。

这是特定功能:

find_closest_centroids <- function(X, centroids) {
  m <- nrow(X)
  c <- integer(m)

  for(i in 1:m){
    distances = rowNorms(sweep(centroids,2,X[i,]))

    c[i] = which.min(distances)
  }
  return(c)
}

在Python中,我可以这样做:

def find_closest_centroids(X, centroids):
    m = len(X)
    c = np.zeros(m)

    for i in range(m):
        distances = np.linalg.norm(X[i] - centroids, axis=1)

        c[i] = np.argmin(distances)

    return c

有什么建议吗?

谢谢。

r k-means
1个回答
0
投票

正如dvd280在其评论中指出的那样,R在性能方面往往比许多其他语言差。如果满足于使用Python编写代码的性能,但需要R中提供的功能,则可能需要研究reticulate包,该包提供了python的接口,就像dvd280提到的C ++包为C ++所做的那样。

如果您仍然想在R中本机实现,请注意所使用的数据结构。对于按行操作,数据帧是列列表,因此是一个较差的选择。我不确定您代码中的数据结构,但是Rcpp似乎是一种矩阵方法。您可能会从行结构列表中获得更多收益。

如果您想进入rowNorms(),可以发现dplyr很有帮助。由于该插图基于this vignette on row-wise operations 1.0,因此请确保您具有该软件包的最新版本。

dplyr包往往会在R中为大型数据集产生最佳性能,但是我对此并不熟悉,因此我无法为您提供任何进一步的指导。

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