r - 在 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
有什么建议吗?
谢谢。
解决方案
正如 dvd280 在他的评论中指出的那样,R 在性能方面往往比许多其他语言做得更差。如果您对 Python 代码的性能感到满意,但需要 R 中可用的函数,您可能需要查看reticulate
提供 Python 接口的Rcpp
包,就像 dvd280 提到的用于 C++ 的包一样。
如果您仍想在 R 中本地实现这一点,请注意您使用的数据结构。对于按行操作,数据框是一个糟糕的选择,因为它们是列的列表。我不确定您代码中的数据结构,但rowNorms()
似乎是一种矩阵方法。您可能会从行结构列表中获得更多信息。
如果你想进入dplyr
,你会发现这个关于逐行操作的小插曲很有帮助。确保您拥有最新版本的软件包,因为小插图基于dplyr
1.0。
该data.table
包往往会为 R 中的大型数据集产生最佳性能,但我不熟悉它,所以我不能给你任何进一步的指示。
推荐阅读
- python - Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件
- javascript - 如何在对象数组中扩展子数组并删除字符串某些元素
- google-chrome - 发送有关所有选项卡的信息,但侦听器仅工作一次并显示最终选项卡的 URL
- javascript - React Calculator:输入标签值显示小数和其他符号不正确
- html - 如何在 Chrome 中将表情符号在视觉上水平居中?
- javascript - D3 平分线功能无法正常工作
- c++ - c++ 中的这种语法是什么意思?
- python - 熊猫大步阅读 csv
- html - 如何下载和显示pdf
- javascript - 如何在 ng datepicker 中设置语言环境