2014-09-12 36 views
2

我的問題是關於典型的前饋單隱層backprop神經網絡,在package nnet中實現,並且使用在包裝符號中進行了培訓。當輸出爲負數時,用插入符號訓練nnet和avNNet模型

  1. raw Y ~ raw X:預測輸出是均勻地爲零,其中:這是我說明問題用簡單的迴歸示例,其中Y = sin(X) + small error有關this question但在NNET和尖包在R.

    上下文原料Y < 0

  2. scaled Y (to 0-1) ~ raw X:解決方案看起來很棒;看下面的代碼。

的代碼如下

library(nnet) 
X <- t(t(runif(200, -pi, pi))) 
Y <- t(t(sin(X)))   # Y ~ sin(X) 
Y <- Y + rnorm(200, 0, .05) # Add a little noise 
Y_01 <- (Y - min(Y))/diff(range(Y)) # Y linearly transformed to have range 0-1. 
plot(X,Y) 
plot(X, Y_01) 
dat <- data.frame(cbind(X, Y, Y_01)); names(dat) <- c("X", "Y", "Y_01") 
head(dat) 
plot(dat) 

nnfit1 <- nnet(formula = Y ~ X, data = dat, maxit = 2000, size = 8, decay = 1e-4) 
nnpred1 <- predict(nnfit1, dat) 
plot(X, nnpred1) 

nnfit2 <- nnet(formula = Y_01 ~ X, data = dat, maxit = 2000, size = 8, decay = 1e-4) 
nnpred2 <- predict(nnfit2, dat) 
plot(X, nnpred2) 

當使用插入符號train(),有一個預處理的選擇,但它僅縮放輸入train(..., method = "nnet", ...)似乎在使用原始值Y值;看下面的代碼。

library(caret) 
ctrl <- trainControl(method = "cv", number = 10) 
nnet_grid <- expand.grid(.decay = 10^seq(-4, -1, 1), .size = c(8)) 
nnfit3 <- train(Y ~ X, dat, method = "nnet", maxit = 2000, 
      trControl = ctrl, tuneGrid = nnet_grid, preProcess = "range") 
nnfit3 
nnpred3 <- predict(nnfit3, dat) 
plot(X, nnpred3) 

當然,我可以線性變換Y變量(S)有一個積極的範圍內,但後來我的預測將是錯誤的規模。雖然這只是一個小問題,但我想知道是否有一個更好的解決方案,用於在輸出值爲負值時使用插入符號訓練nnet或avNNet模型。

回答

2

這是回答跨用戶驗證heretopepo

他們的答案的相關部分是:

由於Y是大致介於-1和1,你也應該在你的nnet使用linout = TRUEtrain來電。