我编写了一个使用无监督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
有什么建议吗?
谢谢。
正如dvd280在其评论中指出的那样,R在性能方面往往比许多其他语言差。如果满足于使用Python编写代码的性能,但需要R中提供的功能,则可能需要研究reticulate
包,该包提供了python的接口,就像dvd280提到的C ++包为C ++所做的那样。
如果您仍然想在R中本机实现,请注意所使用的数据结构。对于按行操作,数据帧是列列表,因此是一个较差的选择。我不确定您代码中的数据结构,但是Rcpp
似乎是一种矩阵方法。您可能会从行结构列表中获得更多收益。
如果您想进入rowNorms()
,可以发现dplyr
很有帮助。由于该插图基于this vignette on row-wise operations 1.0,因此请确保您具有该软件包的最新版本。
dplyr
包往往会在R中为大型数据集产生最佳性能,但是我对此并不熟悉,因此我无法为您提供任何进一步的指导。