首页 > 解决方案 > 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 中并绘制它们,但这也需要很长时间。有没有更快的方法来制作图表?

谢谢

标签: rloopsruntimedata-visualizationdata-manipulation

解决方案


创建一个执行所有分析步骤的函数并将其传递给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,可用于创建您想要的图表。


推荐阅读