R Advent Calendar 2014 (ATND)のクリスマス・イヴ担当ということで、クリスマスツリーを描いてみます。
まずは去年もやったSVMで、ついでにちょっとだけホワイト・クリスマス感を出してみた感じで。クリスマスツリーのデータはGitHubから落としてきて、dtという名前でインポートしておきます。
> library(e1071) > px<-seq(-3,3,0.3) > py<-seq(-3,3,0.3) > pgrid<-expand.grid(px,py) > names(pgrid)<-c('x','y') > dt<-read.delim('xmastree_dt.txt') > dt.svm<-svm(label~.,dt) > out.dt.svm<-predict(dt.svm,newdata=pgrid) > plot(0,0,xlim=c(-3,3),ylim=c(-3,3)) > rect(-3,-3,3,3,col='black') > points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2) > par(new=T) > contour(px,py,array(out.dt.svm,dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)
去年よりちょっとだけクリスマス気分が増しましたかね? ということで、今度は{h2o}のDeep Learningで同じようにクリスマスツリーを描いてみようと思います!
まずは隠れ層を10ユニット4層にして活性化関数はTanhという比較的シンプルなパラメータのセットで。
> write.table(pgrid,file='pgrid33.txt',quote=F,col.names=T,row.names=F,sep='\t') > library(h2o) > localH2O <- h2o.init(ip = "localhost", port = 54321, startH2O = TRUE, nthreads=6) > xmData<-h2o.importFile(localH2O,path='xmastree_dt.txt') > pgData<-h2o.importFile(localH2O,path='pgrid33.txt') > dt.dl<-h2o.deeplearning(x=1:2,y=3,data=xmData,activation='Tanh',hidden=c(10,10,10,10),epochs=5) > out.dt.dl<-h2o.predict(dt.dl,newdata=pgData) > out.dt.dl.df<-as.data.frame(out.dt.dl) > plot(0,0,xlim=c(-3,3),ylim=c(-3,3)) > rect(-3,-3,3,3,col='black') > points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2) > par(new=T) > contour(px,py,array(out.dt.dl.df[,1],dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)
全然ダメじゃんorz もうちょっと色々試してみました。今度は隠れ層を6ユニット6層にしてNesterov accelerated gradientをオンにし、さらに学習係数周りのパラメータもつけてみました。
> dt.dl<-h2o.deeplearning(x=1:2,y=3,data=xmData,activation='Tanh',hidden=rep(6,6),epochs=200,nesterov_accelerated_gradient = T,fast_mode=T,rate_decay = 1.0, momentum_start = 0.5,momentum_ramp = 5000, momentum_stable = 0.99,rate=0.01, rate_annealing = 1.0e-9) > out.dt.dl<-h2o.predict(dt.dl,newdata=pgData) > out.dt.dl.df<-as.data.frame(out.dt.dl) > plot(0,0,xlim=c(-3,3),ylim=c(-3,3)) > rect(-3,-3,3,3,col='black') > points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2) > par(new=T) > contour(px,py,array(out.dt.dl.df[,1],dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)
木になってねーよコラ。もうちょっとさらに色々変えてみます。今度は活性化関数をRectifierに変え、隠れ層を6ユニット10層に変えて複雑な曲がりくねりに対応できるようにして、さらにrate_annealingナシにしてみました。
> dt.dl<-h2o.deeplearning(x=1:2,y=3,data=xmData,activation='Rectifier',hidden=rep(6,10),epochs=200,nesterov_accelerated_gradient = T,fast_mode=T,rate_decay = 1.0, momentum_start = 0.5,momentum_ramp = 5000, momentum_stable = 0.99,rate=0.01, rate_annealing = 0) > out.dt.dl<-h2o.predict(dt.dl,newdata=pgData) > out.dt.dl.df<-as.data.frame(out.dt.dl) > plot(0,0,xlim=c(-3,3),ylim=c(-3,3)) > rect(-3,-3,3,3,col='black') > points(dt[,-3],col=c(rep('red',128),rep('white',113)),pch=19,cex=2) > par(new=T) > contour(px,py,array(out.dt.dl.df[,1],dim=c(length(px),length(py))),xlim=c(-3,3),ylim=c(-3,3),col="green",lwd=3,drawlabels=F)
えらく大ざっぱな木になったな、というかこれじゃダースベイダーの輪郭じゃないか。。。そもそも複雑な曲がりくねりに対応できてないままだし。。。ともあれメリークリスマス!(滝汗)