【问题标题】:R median large vectorR中值大向量
【发布时间】:2018-08-10 20:55:56
【问题描述】:

我很难找到一种方法来更快地计算 R 中大向量的中位数和平均值。我将如何实现更快的方法? 我正在做上面的代码,但它太慢了。 我正在考虑并行处理,但我不知道如何进行这项工作。谢谢。

    vector <- 1:10000000000
    m <- mean(vector)
    md <- median(vector)

【问题讨论】:

  • 这个问题可能是相关的:stackoverflow.com/q/34771088/324364
  • 你的向量总是1:n?
  • @F.Privé,没有。它不是。我想知道一种更快地计算平均值和中位数的方法,对于不同于 1:n 的大向量。

标签: r parallel-processing median


【解决方案1】:

假设我们正在处理一个顺序整数向量 1:n。这可能会对您有所帮助:

## Given
V <- 1:10e8    
n <- length(V)

## To get median,
median <- ifelse(n %% 2 == 0, mean(V [(n/2):((n/2) + 1)]), V [(n + 1)/2])
median
OUTPUT: 5e+08

## To get mean,
sum_series <- n*(n + 1) / 2    # Mathematical Fact
mean <- sum_series / n
mean
OUTPUT: 5e+08

对于大的随机向量,中位数的工作原理仍然相同。如果没有封闭公式,您可以估计的平均值:

### Estimation via Repeated Sampling ### 
est_mean <- function (V, k, size) {
  # k: Number of means to use in estimation
  # size: Sample size of each estimation  
  est <- rep(NA, k)
  samp <- matrix(NA, nrow = size, ncol = k)

  for (j in 1:k) samp [, j] <- sample(V, size, replace = TRUE)
  for (j in 1:k) est [j] <- mean(samp [, j])
  est <- sort(est)

  return(est [ceiling(length(est)/2)])
}

### Time Complexity of Estimation ### 
# samp + est = k*size + k 
#     If size, k ~ 30 --> Enough to get normal mean distribution
# iterate amount*(create sample vector + store) = k*(size + size)
#     --> 2*k*size 
# Total = k + 3*k*size --> constant

### Time Complexity of Base R Mean () ###
# Assuming it's this: mean (V) <- sum(V)/length(V)
# sum N items + find length + 1 division + 1 return = N + 3


### Example ###
set.seed(0)
V <- sort(sample(0:10e8, 10e7, replace = TRUE))

start1 <- Sys.time()
est_mu <- est_mean(V, 1000, 30)
end1 <- Sys.time()
diff1 <- end1 - start1

start2 <- Sys.time()
r_mu <- mean (V)
end2 <- Sys.time()
diff2 <- end2 - start2

diff1
OUTPUT: Time difference of 0.08370018 secs
diff2
OUTPUT: Time difference of 0.5321879 secs

print(paste("% Difference = ", abs(r_mu - est_mu)/r_mu))
OUTPUT: "% Difference =  0.00678363793285072"

【讨论】:

  • 我注意到向量整数序列的中位数 = 平均值(即 1:n,在您的情况下,n = 10000000000)。如果每次都成立,您可以只计算其中一个(可能意味着因为它更快)并等同于得到另一个。
  • 谢谢,但是,如果我的向量与 1:n 不同怎么办?也许我不够清楚,但是如果向量中有这么大的随机数,我该怎么办?
  • 计算中位数的方法还是和上面的一样,只是记得对你的向量进行排序。平均值比较棘手,除非你能找到一个接近的求和形式。据此,rstudio-pubs-static.s3.amazonaws.com/…,并行求和并不比 base r sum() 好。
  • 我无法弄清楚如何准确快速地计算平均值,但您可以非常接近和快速地估计它。我提供了一种方法来做到这一点。希望它对你来说已经足够好了。
猜你喜欢
  • 2022-10-02
  • 2014-12-28
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多