为什么这个预测函数在使用 cumsum() 时需要一个零?

Why does this prediction function need a zero when using cumsum()?

我正在上一门 udemy 课程,在一节课中有一个函数接受由 1 和 0 组成的向量 x,并根据之前的 k 值序列预测下一个值。我正在努力思考为什么我需要在 csx <- c(0,cumsum(x)).

行的以下函数中包含一个 0
 predc <- function(x,k) {
  n <- length(x)
  k2 <- k/2
  # the vector pred will contain our predicted values
  pred <- vector(length=n-k)
  csx <- c(0,cumsum(x))
  for (i in 1:(n-k)) {
    if (csx[i+k] - csx[i] >= k2) 
        pred[i] <- 1 
     else 
        pred[i] <- 0
  }
  return(mean(abs(pred-x[(k+1):n])))
}

0 可以正确处理 i=1 的情况。加上前缀 0,累积和向量的第一个元素 csx 因此也将是 0,即 csx[1]=0。这意味着对于 i=1 我们将评估语句

if (csx[1+k] >= k2) pred[1] <- 1 else pred[1] <- 0

这个 i=1 通常被放置在预测函数(例如这个)的 for 循环之外(之前),以防我们无法使用 cumsum()。即,如果没有 cumsum,我们将在循环之前使用

之类的形式评估 i=1 表达式
mysum <- sum(x[1:k]
if (mysum >= k2) pred[1] <- 1 else pred[1] <- 0

然后在i=2n-k的for函数中重复更新mysum。最后请注意 sum(x[1:k] 等同于 c(0,cumsum(x)).

中的元素 k+1

它可以正确处理第一个元素的滞后。你可以试试下面的一段代码来直观地看出区别:

predc <- function(x,k) {
  n <- length(x)
  k2 <- k/2
  # the vector red will contain our predicted values
  pred <- vector(length=n-k)
  csx <- c(0,cumsum(x))
  for (i in 1:(n-k)) {
    if (csx[i+k] - csx[i] >= k2) pred[i] <- 1 else pred[i] <- 0
  }
  return(mean(abs(pred-x[(k+1):n])))
}

x <- sample(c(0,1), 1000, replace = TRUE)
pred(x, 1)
[1] 0.4974975

修改函数不加0:

predc <- function(x,k) {
  n <- length(x)
  k2 <- k/2
  # the vector red will contain our predicted values
  pred <- vector(length=n-k)
  csx <- cumsum(x)
  for (i in 1:(n-k)) {
    if (csx[i+k] - csx[i] >= k2) pred[i] <- 1 else pred[i] <- 0
  }
  return(mean(abs(pred-x[(k+1):n])))
}

pred(x, 1)
[1] 0

注意:没有第一个前置滞后项的 pred(x, 2) 也会出现同样的收敛问题。