PRML読書会第一回

PRMLって何のことかこの前まで分かってなかったんですが、パターン認識と機械学習 上 - ベイズ理論による統計的予測のことだそうです。予告していた通りskypeを使った読書会をやりました。id:wilsoniaさんとid:showyouさんとid:Lianさんとid:laughingさんと僕の合計5人でやりました。あ、XR(extream reading)ということで当面人数を増やす予定はないです、ごめんなさい。

初めてのXRということでどうなることかと思っていたんですが、id:ujihisaからもらったアドバイスにより一回目にしては結構よかったんじゃないかなーと思っています。自己紹介やったりしたんで10ページくらいとまったりなペースですが、継続が重要。skypeでも結構勉強会できるよ。数式があっても同じテキストがあったりとか、はてなハイクを使って図を書いたりとかすればどうにかなる。

過学習の例をRで

途中でP5の1.1式y(x,w)=\sum^M_{j=0}w_j x^jsin(2 \pi x)を回帰しよーぜーみたいなやつがあって、Mをでかくしすぎると過学習しちゃうよねーみたいな例があったりしました(言葉がいいかげんすぐる)。その例がP6の図1.4だったりするわけですが、これを自分で書けたらいいかなということでRで書いてみました。predictはdata.frameにしないといけないのを忘れててはまったりなどした。上からM=1,3,9の例です。

f:id:syou6162:20161009221614p:plain
f:id:syou6162:20161009221626p:plain
f:id:syou6162:20161009221639p:plain

nごとに関数を作り変えるのがいやだったので、

x1 <- x;x2 <- x^2;x3 <- x^3

みたいな式を動的に作ってます。というわけでpasteやらReduceやらevalで読めたもんじゃないんだけど、まあ書き捨てということで。

takousiki <- function(n){
  plot(function(x){sin(2*pi*x)},0,1,ylab="",ylim=c(-1.5,1.5))
  par(new=T)
  x <- seq(0,1,by=0.1)
  y <- sin(2 * pi * seq(0,1,by=0.1)) + rnorm(11,sd=0.5)
  plot(x,y,ylab="",ylim=c(-1.5,1.5))
  par(new=T)
  invisible(mapply(function(v){eval(parse(text=v))},(function(x){paste("x",x," <<- ","x^",x,sep="")})(seq(n))))
  eval(parse(text=paste("lm <- lm(y ~ ",Reduce(function(x,init){paste(x,init,sep=" + ")},paste("x",seq(n),sep="")),")",sep="")))
  newdata <- seq(0,1,by=0.01)
  eval(parse(text=paste("newdata <- data.frame(",Reduce(function(x,init){paste(x,init,sep=",")},(function(x){paste("x",x,"=newdata^",x,sep="")})(seq(n))),")",sep="")))
  par(new=T)
  plot(seq(0,1,by=0.01),predict(lm,newdata=newdata),type="l",col="red")
}

takousiki(1)
takousiki(3)
takousiki(9)

読めるコードを書く気がないらしい。

参加者レポート

みんな上げるの早い!!