R によるテキストの図1.3と図1.4の確認

以下のページを参考にした。

http://d.hatena.ne.jp/sesejun/20090402/p1

 

上記のページの 218 の17個の点でやってみる。

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)
plot(x1,y)

 

 

> m0 <- lm(y ~ -1 + x1)

> abline(m0,col="red")

 

 

> rbf <- rbfdot(sigma=1)

> k <- kernelMatrix(rbf, x1)

> alpha <- solve(k) %*% y

> gauss <- function(x1,x2) exp(-1.0 * (x1-x2)^2)

> f1 <- function(x) sapply(x, function(y) gauss(x1, y) %*% alpha)

> curve(f1, col="blue", add=TRUE)

 

難しいのは f1 の作成。普通なら、


f1 <- function(y) gauss(x1,y) %*% alpha

でよいはず、計算結果だけ得るのなら、これでOK

だけど、この形では、curve で曲線を描けない。

いろいろ悩んで上記のサイトをカンニング。

sapply lapply を被せればよい、、、知らなかった。

 

 

正則化の部分

> lambda <- 0.01

> k2 <- k + lambda * diag(17)

> alpha <- solve(k2) %*% y

> plot(x1,y)

> curve(f1,col="red",add=T)

 

SVM でやってみると・・

> svm0 <- ksvm(x1,y,epsilon=0.01)

Using automatic sigma estimation (sigest) for RBF or laplace kernel

> svm0pre <- predict(svm0,x1)

> plot(x1,y)

> lines(x1,svm0pre,col="red")