您可以将模型放入函数中并bandwith
使用lapply
. 然后,您可以简单地计算每次运行的 RMSE 并取min
.
library(caret)#for RMSE() function
set.seed(5)
x <- runif(1000)
y <- 20*(1/exp(x*20))+runif(1000,1,5)
plot(x,y)
df <- data.frame(x,y)
ind <- sample(1:nrow(df),nrow(df))
train_points <- df[ind,]
test_points <- df[-ind,]
mykern <- function(x, y, bw) {
kernelreg <- lapply(bw, function(bw)
ksmooth(x,
y,
kernel = "normal",
bandwidth = bw))
names(kernelreg)<- bw
rmse <- lapply(kernelreg, function(x)RMSE(x[["y"]],y))
names(rmse) <- bw
best.bw <- names(rmse[rmse==min(unlist(rmse))])
best.kern <- kernelreg[[which(names(kernelreg)==best.bw)]]
ll <- list(best.model=best.kern,best.bandwith=best.bw)
return(ll)
}
kernelreg <- mykern(train_points$x,
train_points$y,
bw = seq(0.1,1,0.1))
但是,请按照以下文档的建议查看该KernSmooth
软件包ksmooth
:
这个函数是为了与 S 兼容而实现的,尽管它远没有 S 函数那么慢。其他软件包(例如KernSmooth )中提供了更好的内核平滑器。