为什么这个预测函数在使用 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=2
到n-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) 也会出现同样的收敛问题。
我正在上一门 udemy 课程,在一节课中有一个函数接受由 1 和 0 组成的向量 x,并根据之前的 k 值序列预测下一个值。我正在努力思考为什么我需要在 csx <- c(0,cumsum(x)).
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=2
到n-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) 也会出现同样的收敛问题。