rbga.bin {genalg} | R Documentation |
A R based genetic algorithm that optimizes, using a user set evaluation function, a binary chromosome which can be used for variable selection. The optimum is the chromosome for which the evaluation value is minimal.
It requires a evalFunc
method to be supplied that takes as argument
the binary chromosome, a vector of zeros and ones.
Additionally, the GA optimization can be monitored by setting a
monitorFunc
that takes a rbga
object as argument.
Results can be visualized with plot.rbga
and summarized with
summary.rbga
.
rbga.bin(size=10, suggestions=NULL, popSize=200, iters=100, mutationChance=NA, elitism=5, zeroToOneRatio=10, monitorFunc=NA, evalFunc=NA showSettings=FALSE, verbose=FALSE)
size |
the number of genes in the chromosome. |
popSize |
the population size. |
iters |
the number of iterations. |
mutationChance |
the chance that a gene mutates. By default 1/(size+1). |
elitism |
the number of chromosomes that are kept into the next generation. By default is about 20% of the population size. |
zeroToOneRatio |
the change for a zero for mutations and initialization. |
monitorFunc |
Method run after each generation to allow monitoring of the optimization |
evalFunc |
User supplied method to calculate the evaluation function for the given chromosome |
showSettings |
if true the settings will be printed to screen. By default False. |
verbose |
if true the algorithm will be more verbose. By default False. |
suggestions |
optional list of suggested chromosomes |
C.B. Lucasius and G. Kateman (1993). Understanding and using genetic algorithms - Part 1. Concepts, properties and context. Chemometrics and Intelligent Laboratory Systems 19:1-33.
C.B. Lucasius and G. Kateman (1994). Understanding and using genetic algorithms - Part 2. Representation, configuration and hybridization. Chemometrics and Intelligent Laboratory Systems 25:99-145.
# a very simplistic optimization evaluate <- function(string=c()) { returnVal = 1 / sum(string); returnVal } rbga.results = rbga.bin(size=10, mutationChance=0.01, zeroToOneRatio=0.5, evalFunc=evaluate) plot(rbga.results) # in this example the four variables in the IRIS data set are complemented # with 36 random variables. Variable selection should find the four original # variables back (example by Ron Wehrens). ## Not run: data(iris) library(MASS) X <- cbind(scale(iris[,1:4]), matrix(rnorm(36*150), 150, 36)) Y <- iris[,5] iris.evaluate <- function(indices) { result = 1 if (sum(indices) > 2) { huhn <- lda(X[,indices==1], Y, CV=TRUE)$posterior result = sum(Y != dimnames(huhn)[[2]][apply(huhn, 1, function(x) which(x == max(x)))]) / length(Y) } result } monitor <- function(obj) { minEval = min(obj$evaluations); plot(obj, type="hist"); } woppa <- rbga.bin(size=40, mutationChance=0.05, zeroToOneRatio=10, evalFunc=iris.evaluate, verbose=TRUE, monitorFunc=monitor) ## End(Not run) # another realistic example: wavelenght selection for PLS on NIR data ## Not run: library(pls.pcr) data(NIR) numberOfWavelenghts = ncol(NIR$Xtrain) evaluateNIR <- function(chromosome=c()) { returnVal = 100 minLV = 2 if (sum(chromosome) < minLV) { returnVal } else { xtrain = NIR$Xtrain[,chromosome == 1]; pls.model = pls(xtrain, NIR$Ytrain, validation="CV", grpsize=1, ncomp=2:min(10,sum(chromosome))) returnVal = pls.model$val$RMS[pls.model$val$nLV-(minLV-1)] returnVal } } monitor <- function(obj) { minEval = min(obj$evaluations); filter = obj$evaluations == minEval; bestObjectCount = sum(rep(1, obj$popSize)[filter]); # ok, deal with the situation that more than one object is best if (bestObjectCount > 1) { bestSolution = obj$population[filter,][1,]; } else { bestSolution = obj$population[filter,]; } outputBest = paste(obj$iter, " #selected=", sum(bestSolution), " Best (Error=", minEval, "): ", sep=""); for (var in 1:length(bestSolution)) { outputBest = paste(outputBest, bestSolution[var], " ", sep=""); } outputBest = paste(outputBest, "\n", sep=""); cat(outputBest); } nir.results = rbga.bin(size=numberOfWavelenghts, zeroToOneRatio=10, evalFunc=evaluateNIR, monitorFunc=monitor, popSize=200, iters=100, verbose=TRUE) ## End(Not run)