2016-01-07 23 views
1

我正在參加一個udemy課程,並且在一課中有一個函數需要使用1和0的向量x,並基於之前的k值序列預測下一個值。我試圖總結我的周圍腦爲什麼我需要在下面的函數在0線csx <- c(0,cumsum(x)).爲什麼使用cumsum()時這個預測函數需要一個零?

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]))) 
} 

回答

1

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此後反覆更新所述mysum。最後請注意,sum(x[1:k]相當於c(0,cumsum(x))中的元素k+1

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 

注:同樣的收斂問題發生的預計值(X,2)不說首先預先延遲期限。

+0

只是一個註釋:它不是處理_「案例pred(x,1)」_(如在_specific調用to_'predc',請注意上面的函數調用中缺少的'c' typo),它是所有對'predc'的調用都需要預測函數按預期工作(未移位)。前置0專門用於嵌入在函數_中的for循環中'i = 1'的代碼。因此,如果上面顯示的'pred(x,1)'錯誤確實是錯誤行爲的一個例子,如果忽略cumsum中的0,但它不是受其影響的單個情況。 – dfri

+1

你是對的。我匆忙地寫了這些。它是在那裏處理第一次滯後。更多的是旨在展示如何通過抽樣和調用該功能來檢驗其重要性。收斂的問題是k的任何較小的值,因爲第一個元素的滯後產生問題。將編輯答案。 – Gopala

相關問題