認知情報科学基礎実習 課題03
提出期限:2013.01.31 23:59
勾配法、単純確率的最適化法、焼き鈍し法を比較してみましょう。
目的関数:x^4-16*x^2-5*x+y^4-16*y^2-5*y
初期値:一様分布(-0.5~0.5)に従う乱数
繰り返し数:1000回
各最適化法の結果の平均を可視化して(下の図のようなもの)傾向を考察してみてください。
各最適化は下のものを参考にしてください。
各最適化法のパラメターを変えてみてましょう。
#Objective Function
funZ<-function(x,y) {x^4-16*x^2-5*x+y^4-16*y^2-5*y}
xmin=-5;xmax=5;n_len=100;
x<-seq(xmin, xmax,length.out=n_len);y<-x;z<-outer(x,y,funZ)
#gradient descent
minGD<-function(initXY=c(0,0), maxItr=1000, stepSize=0.01){
x=initXY[1];y=initXY[2];z=funZ(x,y);
opHist=matrix(0,nrow=maxItr,ncol=3)
opHist[1,]=c(x,y,z)
for (i_loop in 2:maxItr) {
x=x-stepSize*(4*x^3-32*x-5);
y=y-stepSize*(4*y^3-32*x-5);
z=funZ(x,y);
opHist[counter,]=c(x,y,z);
}
return(opHist[1:counter,])
}
res<-minGD(c(0.5,0.5),1000,0.01)
contour(x,y,z,nlevels=30,drawlabel=F)
lines(res[,1:2],col='cyan',type='o',pch=19)
#Simple Stochastic Optimization
minSTOCH<-function(initXY=c(0,0),maxItr=1000,width=0.1) {
x=initXY[1];y=initXY[2];z=funZ(x,y);
opHist=matrix(0,nrow=maxItr,ncol=3)
opHist[1,]=c(x,y,z)
for (i_loop in 2:maxItr) {
xTemp=x+rnorm(1,mean=0,sd=width);
yTemp=y+rnorm(1,mean=0,sd=width);
zTemp=funZ(xTemp,yTemp);
if (z > zTemp) {
x=xTemp;y=yTemp;z=zTemp;
}
opHist[i_loop,]=c(x,y,z);
}
return(opHist)
}
opHist<-minSTOCH(c(0,0),1000,0.1)
contour(x,y,z,nlevels=30,drawlabel=F)
lines(opHist[,1:2],type='o',lwd=2,col='green',pch=20)
#Simulated Annealing
minSA<-function(initXY=c(0,0),maxItr=1000,C=1,eta=0.99,width=10) {
x=initXY[1];y=initXY[2];z=funZ(x,y);
opHist=matrix(0,nrow=maxItr,ncol=3)
opHist[1,]=c(x,y,z)
for (i_loop in 2:maxItr) {
xTemp=x+rnorm(1,mean=0,sd=width)
yTemp=y+rnorm(1,mean=0,sd=width)
zTemp=funZ(xTemp, yTemp);
delta=zTemp-z;
prob=1/(1+exp(delta/(C*width)))
if (runif(1) < prob) {
x=xTemp;y=yTemp;z=zTemp;
}
opHist[i_loop,]=c(x,y,z);
width=width*eta
}
return(opHist)
}
res<-minSA(c(0,0),1000,1,0.99,10)
contour(x,y,z,nlevels=30,drawlabel=F)
lines(res[,1:2],type='o',lwd=2,col='green',pch=20)
