r - R:在 R 中循环和可视化“运行时间”
问题描述
我正在使用 R 编程语言。我想学习如何随着数据大小的增加测量和绘制差异程序的运行时间。
我发现以前的 stackoverflow 帖子回答了一个类似的问题:绘制三个函数的运行时间
看来R中的“微基准”库应该能够完成这项任务。
假设我模拟以下数据:
#load libraries
library(microbenchmark)
library(dplyr)
library(ggplot2)
library(Rtsne)
library(cluster)
library(dbscan)
library(plotly)
#simulate data
var_1 <- rnorm(1000,1,4)
var_2<-rnorm(1000,10,5)
var_3 <- sample( LETTERS[1:4], 1000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05) )
var_4 <- sample( LETTERS[1:2], 1000, replace=TRUE, prob=c(0.4, 0.6) )
#put them into a data frame called "f"
f <- data.frame(var_1, var_2, var_3, var_4)
#declare var_3 and response_variable as factors
f$var_3 = as.factor(f$var_3)
f$var_4 = as.factor(f$var_4)
#add id
f$ID <- seq_along(f[,1])
现在,我想测量 7 个不同程序的运行时间:
#Procedure 1: :
gower_dist <- daisy(f[,-5],
metric = "gower")
gower_mat <- as.matrix(gower_dist)
#Procedure 2
lof <- lof(gower_dist, k=3)
#Procedure 3
lof <- lof(gower_dist, k=5)
#Procedure 4
tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
data.frame() %>%
setNames(c("X", "Y")) %>%
mutate(
name = f$ID)
#Procedure 5
tsne_obj <- Rtsne(gower_dist, perplexity =10, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
data.frame() %>%
setNames(c("X", "Y")) %>%
mutate(
name = f$ID)
#Procedure 6
plot = ggplot(aes(x = X, y = Y), data = tsne_data) + geom_point(aes())
#Procedure 7
tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
data.frame() %>%
setNames(c("X", "Y")) %>%
mutate(
name = f$ID,
lof=lof,
var1=f$var_1,
var2=f$var_2,
var3=f$var_3
)
p1 <- ggplot(aes(x = X, y = Y, size=lof, key=name, var1=var1,
var2=var2, var3=var3), data = tsne_data) +
geom_point(shape=1, col="red")+
theme_minimal()
ggplotly(p1, tooltip = c("lof", "name", "var1", "var2", "var3"))
使用“microbenchmark”库,我可以找出各个函数的时间:
procedure_1_part_1 <- microbenchmark(daisy(f[,-5],
metric = "gower"))
procedure_1_part_2 <- microbenchmark(as.matrix(gower_dist))
这是我卡住的地方:
我想制作这样的运行时间图:
https://umap-learn.readthedocs.io/en/latest/benchmarking.html
有人可以告诉我如何制作这个图表并一次使用多个函数的微基准语句(对于不同大小的数据框“f”(对于 f = 5、10、50、100、200、500、100)?
microbench(cbind(gower_dist <- daisy(f[1:5,-5], metric = "gower"), gower_mat <- as.matrix(gower_dist))
microbench(cbind(gower_dist <- daisy(f[1:10,-5], metric = "gower"), gower_mat <- as.matrix(gower_dist))
microbench(cbind(gower_dist <- daisy(f[1:50,-5], metric = "gower"), gower_mat <- as.matrix(gower_dist))
ETC
我可以手动运行其中的每一个,将结果复制到 excel 中并绘制它们,但这也需要很长时间。有没有更快的方法来制作图表?
谢谢
解决方案
创建一个执行所有分析步骤的函数并将其传递给microbenchmark
. 在伪代码中,类似于
runAnalysis <- function(x, size) {
x <- x[1:size, ]
# forther steps of the analysis
}
xy <- microbenchmark(
subset_5 = runAnalysis(x = f, size = 5),
subset_50 = runAnalysis(x = f, size = 50),
times = 1
)
以毫秒为单位的平均时间xy$time
和运行的名称在 中xy$expr
,可用于创建您想要的图表。
推荐阅读
- razor - 是否可以从 DNNSharp 的 Action Form 或 Action Grid 获取内容或令牌并将其显示在 2sxc 模板中?
- c++ - 带有 enqueue_event 的 OpenCL 2.x clk_event_t 给出了令人惊讶的错误
- nlp - 使用 Huggingface 库差分生成句子以进行对抗性训练 (GAN)
- ios - 当我尝试使用用户默认值存储字典时出现错误
- cs50 - PSET 4 REFLECT 错误未反映最后一行
- python - 运行简单的 Ansible playbook 时出错
- ios - 我该如何解决这个“Invalid `Podfile`”错误?
- azure-service-fabric - Azure Patch Orchestration (POA) 是否在群集“警告”或仅“错误”上被阻止
- python - google colab 上的 Python 图像处理
- javascript - 如何检查 jQuery 中没有文本的空 div?