首页 > 解决方案 > 在 R 中计算 rowNorms 的更有效方法?

问题描述

我使用无监督 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

有什么建议吗?

谢谢。

标签: rk-means

解决方案


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

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

如果你想进入dplyr,你会发现这个关于逐行操作的小插曲很有帮助。确保您拥有最新版本的软件包,因为小插图基于dplyr1.0。

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


推荐阅读