在 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 中为大型数据集产生最佳性能,但我不熟悉它,所以我无法就此给你任何进一步的指导。
我使用无监督 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 中为大型数据集产生最佳性能,但我不熟悉它,所以我无法就此给你任何进一步的指导。