Use geo2smoof for mlrMBO

Use convertRasterLayerToSmoof

library(raster)
library(geo2smoof)
# list all available iso codes
getData('ISO3')
# download Data
alt <- getData('alt', country='DEU')

Optional: Subset to a state

adm <- getData('GADM', country='DEU', leve=1)
mar<-(adm[adm$NAME_1=="Nordrhein-Westfalen",])
alt<-crop(alt,mar)

Plot of the raster data

persp(alt, exp=0.2,phi=35, xlab='Longitude', ylab='Latitude', zlab='Elevation', shade=0.45, col='green4')

Convert to Smoof and plot

sf = convertRasterLayerToSmoof(alt)
smoof::plot3D(sf)

Start optimization with MBO

library(mlrMBO)
des = generateDesign(n = 30, par.set = getParamSet(sf))
des$y = apply(des, 1, sf)
des$y[is.na(des$y)] = 0
ctrl = makeMBOControl(impute.y.fun = function(x,y,opt.path) return(0))
ctrl = setMBOControlTermination(ctrl, iters = 40)
lrn = makeLearner('regr.randomForest', predict.type = 'se')
mbo.res = mbo(fun = sf, control = ctrl, design = des, learner = lrn)

What has been executed?

library(ggplot2)
autoplot(sf, render.levels = TRUE, show.optimum = TRUE) + geom_text(data = as.data.frame(mbo.res$opt.path), mapping = aes(label = dob), color = "white")

How does the model see the map?

model = mbo.res$final.opt.state$models$models[[1]]
data = generateGridDesign(getParamSet(sf), resolution = 200)
predict = predict(model, newdata = data)
data$y = getPredictionResponse(predict)
g = ggplot(data, aes(x = coords1, y = coords2, fill = y))
g + geom_tile()

Use convertGoogleApiToSmoof

We use the approximate ranges for Germany

lat.range = c(54.91, 47.26)
lon.range = c(5.79, 15.03)
gsf = convertGoogleApiToSmoof(lat.range = lat.range, lon.range = lon.range)
grid = generateGridDesign(getParamSet(gsf), resolution = 10)
res = gsf(as.matrix(grid))
grid$altitude = res
g = ggplot(grid, aes(x = longitude, y = latitude, fill = altitude))
g + geom_tile()

Let's run it with MBO

library(mlrMBO)
des = generateDesign(n = 30, par.set = getParamSet(gsf))
des$y = gsf(as.matrix(des))
ctrl = makeMBOControl()
ctrl = setMBOControlTermination(ctrl, iters = 40)
mbo.res = mbo(fun = gsf, control = ctrl, design = des)
model = mbo.res$final.opt.state$models$models[[1]]
data = generateGridDesign(getParamSet(gsf), resolution = 200)
predict = predict(model, newdata = data)
data$y = getPredictionResponse(predict)
g = ggplot(data, aes(x = longitude, y = latitude, fill = y))
g + geom_tile()


jakob-r/geo2smoof documentation built on May 14, 2019, 8:21 a.m.