國井君への課題と國井君からの解答
[課題 (from shinnou)]
以下のデータを利用する。
x1 <- c(-1.69,-1.5,-1.3,-1.1,-0.9,-0.7,-0.48,-0.42,-0.05,0.09,0.39,0.48,0.59,1.0,1.08,1.29,1.5)
y <- c(-0.15,-0.25,-0.2,-0.14,-0.21,0,0.34,0.35,0.8,0.75,0.4,0.2,0.15,-0.05,-0.1,-0.35,-0.39)
n <- 17
p.36 の式 2.30 を基にして、
β、λ を引数にして、CV 誤差を計算する関数を作成せよ。
β、λ に適当に数値を入れて、CV 誤差を計算せよ。
# kernlab をインストールして rbfdot や kernelMatrix
を使うのが簡単だと思います。
[國井君の解答]
x1 <- c(-1.69,-1.5,-1.3,-1.1,-0.9,-0.7,-0.48,-0.42,-0.05,0.09,0.39,0.48,0.59,1.0,1.08,1.29,1.5)
y <- c(-0.15,-0.25,-0.2,-0.14,-0.21,0,0.34,0.35,0.8,0.75,0.4,0.2,0.15,-0.05,-0.1,-0.35,-0.39)
n <- 17
CV <-function(beta,lambda){
rbf <- rbfdot(sigma=beta)
K <- kernelMatrix(rbf,x1)
H <- solve(K+lambda*diag(n))%*%K
Y_tilda <- H%*%y
mean(((y-Y_tilda)/(1-diag(H)))**2)
}
> CV(1,0.0000001)
[1] 0.04112429
> CV(1,0.01)
[1] 0.008197025
> CV(1,1)
[1] 0.02984302
> CV(0.1,0.01)
[1] 0.04720498
> CV(1,0.01)
[1] 0.008197025
> CV(10,0.01)
[1] 0.008305022