n.var = 10 n.child = 10 child = matrix(sample(0:1,n.var*n.child, replace =T),nrow =n.child) GA_mutate <- function(child, p){ mut.mat = matrix(sample(0:1,length(child),replace = T, prob = c(1-p, p)),nrow=nrow(child)) return(abs(child-mut.mat)) } GA_crossover<-function(parent){ n.parent = nrow(parent) rand.order = sample(1:n.parent) p1.idx= rand.order[1:(n.parent/2)] p2.idx= rand.order[(n.parent/2+1):n.parent] co.idx = sample(1:(length(parent)/2),length(parent)/4) c1 = parent[p1.idx,] c1.copy = c1 c2 = parent[p2.idx,] c1[co.idx] = c2[co.idx] c2[co.idx] = c1.copy[co.idx] return(child = rbind(c1,c2)) } GA_survive<-function(parent, child, fitP, fitC){ nPop=nrow(parent); fitT=c(fitP,fitC); fitMax=sort(fitT,index.return=TRUE,decreasing = TRUE) tempX=rbind(parent,child); fittest=tempX[fitMax$ix[1:nPop],] return(fittest) } GA<-function(parent, nGen,p,X,Y){ optHist=matrix(0,nrow=nGen,ncol=1) fittest.hist = matrix(0,nrow=nGen,ncol = ncol(parent)) nPop = nrow(parent) nVar = ncol(parent) fitP = rep(0,nPop) fitC = fitP for (i.pop in 1:nPop){ dat.temp = X[,which(parent[i.pop,]==1)] fitP[i.pop] = summary(lm(Y~dat.temp))$adj.r.squared } optHist[1]=max(c(fitP)) fittest.hist[1,] = parent[which.max(fitP),] for (i_gen in 2:nGen) { child<-GA_crossover(parent) child<-GA_mutate(child,p) # assuming same numbers of set of genes for (i.pop in 1:nPop){ dat.temp = X[,which(parent[i.pop,]==1)] fitP[i.pop] = summary(lm(Y~dat.temp))$adj.r.squared if (sum(child[i.pop,])==0){ child[i.pop,sample(1:ncol(child),sample(1:nVar,1))]=1 } dat.temp = X[,which(child[i.pop,]==1)] fitC[i.pop] = summary(lm(Y~dat.temp))$adj.r.squared } parent<-GA_survive(parent, child, fitP, fitC) optHist[i_gen]=max(c(fitP,fitC)) fittest.hist[i_gen, ] = parent[1,] } return(list(fittest = parent, optHist = optHist, fittest.hist = fittest.hist)) } set.seed(19) nVar = 10 nData = 50 X=matrix(rnorm(nVar*nData,mean=10,sd=5),ncol=nVar); y=X%*%c(-2,0,2,0,2,0,-3,0,-2,0)+rnorm(nData,mean=0,sd=8); summary(lm(y~X[,seq(1,9,2)])) summary(lm(y~X)) parent = matrix(sample(0:1,300,replace = T),nrow=30) res<-GA(parent,100,0.1,X,y) head(res$fittest)
より複雑なモデルへ
C = combn(3,2) paste("X",C,sep="") temp.lab =toString(paste("X",C[ , 1], sep = "")) gsub(",", ":", temp.lab) n.comb = ncol(C) var.labels=c() for (i.comb in 1: n.comb){ temp.label = toString(paste("X",C[ , i.comb], sep = "")) var.labels = c(var.labels, gsub(",", ":", temp.label) ) } mk.labels <- function(C){ var.labels = c() n.comb = ncol(C) for (i.comb in 1: n.comb){ temp.label = toString(paste("X",C[ , i.comb], sep = "")) var.labels = c(var.labels, gsub(",", ":", temp.label) ) } return(var.labels) } n.var = 3 max.interaction = 3 # single variable var.labels = paste("X", 1:n.var, sep = "") # interaction terms for (i.interaction in 2:max.interaction ){ combination = combn(n.var, i.interaction) var.labels = c(var.labels, mk.labels(combination)) } model.def = paste("Y ~", gsub(",", "+", toString(var.labels[c(1,1,1,1,1,0,0) == 1]))) set.seed(20) nVar = 3 nData = 50 X=matrix(rnorm(nVar*nData,mean=10,sd=5),ncol=nVar); y=X%*%c(1,1,-2)+rnorm(nData,mean=0,sd=3); dat = data.frame(Y=y,X1=X[,1],X2=X[,2],X3=X[,3]) # example model.def1 = paste("Y ~", gsub(",", "+", toString(var.labels[c(1,1,1,0,0,0,0) == 1]))) model.lm = lm(model.def1, dat)
Evolutionary Strategy
n.parent = 10 n.theta = 10 parent = list(theta = matrix(rnorm(n.parent*n.theta),nrow=n.parent), sigma = matrix(runif(n.parent*n.theta)+1,nrow = n.parent)) ES_crossover<-function(parent){ n.parent = nrow(parent$theta) rand.order = sample(1:n.parent) p1.idx= rand.order[1:(n.parent/2)] p2.idx= rand.order[(n.parent/2+1):n.parent] co.idx = sample(1:(length(parent)/2),length(parent)/4) c1 = parent$theta[p1.idx,] c1.copy = c1 c2 = parent$theta[p2.idx,] c1[co.idx] = c2[co.idx] c2[co.idx] = c1.copy[co.idx] sigma = (parent$sigma[p1.idx,]+parent$sigma[p2.idx,])/2 return(child = list(theta = rbind(c1,c2), sigma = rbind(sigma,sigma))) } ES_mutate<-function(child, tau){ child$sigma = child$sigma* exp(tau*matrix(rnorm(length(child$sigma)),nrow=nrow(child$sigma))) child$theta = child$theta + matrix(rnorm(length(child$sigma),0,child$sigma),nrow=nrow(child$sigma)) return(child) } set.seed(20); nData = 100 X=matrix(rnorm(9*nData,mean=10,sd=2),ncol=9);X=cbind(rep(1,nData),X) y=X%*%c(10,2,5,-3,-5,0,0,0,0,0)+rnorm(nData,mean=0,sd=2); #summary(lm(y~X[,2:10])) # 評価関数 reg.error<-function(b,X,y){ yhat<-X%*%b return(sum((y-yhat)^2)) } # 評価の使用例 fitC = apply(child$theta,1,reg.error, X, y)