在 R 中计算 rowNorms 的更有效方法?

More efficient way to compute the rowNorms in R?

我使用无监督 K-means 算法编写了一个程序来尝试压缩图像。它现在可以工作,但与 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

有什么建议吗?

谢谢。

正如 dvd280 在他的评论中指出的那样,R 在性能方面往往比许多其他语言差。如果对 Python 中代码的性能感到满意,但需要 R 中可用的函数,您可能需要查看 reticulate 包,它提供了 python 的接口,例如 Rcpp dvd280 提到的包适用于 C++。

如果您仍想在 R 中本地实现它,请注意您使用的数据结构。对于按行操作,数据框是一个糟糕的选择,因为它们是列列表。我不确定你代码中的数据结构,但 rowNorms() 似乎是一种矩阵方法。您可能会从行结构列表中获得更多里程。

如果您想进入 dplyr,您会发现 this vignette on row-wise operations 很有帮助。确保您拥有最新版本的软件包,因为小插图基于 dplyr 1.0。

data.table 包往往会在 R 中为大型数据集产生最佳性能,但我不熟悉它,所以我无法就此给你任何进一步的指导。