Использование nlminb для максимизации функций - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующая функция, и мне нужно, чтобы она была развернута, а не свернута.

adbudgReturn = function(Spend,a,b,c,d){
adbudgReturn = sum(b+(a-b)*((Spend^c)/(d+(Spend^c))))
return(adbudgReturn)
}

FP_param <- c(95000,0,1.15,700000)
FB_param <- c(23111.55,0,1.15,20000)
GA_param <- c(115004,1409,1.457,2000000)

y = c(0.333333,0.333333,0.333333)

TotalSpend <- function(Budget,y){
                   FP_clicks = adbudgReturn(Budget * y[1], FP_param[1], FP_param[2],  FP_param[3], FP_param[4])
                   FB_clicks = adbudgReturn(Budget * y[2], FB_param[1], FB_param[2],  FB_param[3], FB_param[4])
                   GA_clicks = adbudgReturn(Budget * y[3], GA_param[1], GA_param[2],  GA_param[3], GA_param[4])
                   return(total = FP_clicks + FB_clicks + GA_clicks)
}




startValVec = c(0.33333,0.333333,0.3333333)
minValVec = c(0,0.2,0)
maxValVec = c(0.8,1,08)


MaxClicks_optim.parms <- nlminb(objective = TotalSpend,start = startValVec,
                     lower = minValVec,
                     upper = maxValVec,
                     control = list(iter.max=100000,eval.max=20000),
                     Budget = 10000)

Я попытался добавить знак минуса перед функцией nlminb, например:

-nlminb(..)

, но безуспешно. Любая помощь будет оценена.

Также я хотел бы добавить ограничения, чтобы сумма maxValVe c = 1

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Другие функции оптимизации в R, такие как optim(), имеют встроенный параметр управления fnscale, который можно использовать для переключения с минимизации на максимизацию (т. Е. optim(..., control=list(fnscale=-1)), но nlminb не отображается. Таким образом, вы либо нужно перевернуть знак в исходной целевой функции, либо (возможно, более прозрачно) создать функцию-обертку, которая инвертирует знак, например,

max_obj <- function(...) -1*TotalSpend(...)
MaxClicks_optim.parms <- nlminb(objective = max_obj, 
           [ .... everything else as before ... ] )

Обратите внимание, что ... в определении max_obj() literal. Единственная часть вышеупомянутого решения, которую необходимо заполнить, это часть [.... everything else as a before ...]. Чтобы быть абсолютно явным:

max_obj <- function(...) -1*TotalSpend(...)
MaxClicks_optim.parms <- nlminb(objective = max_obj,
                 start = startValVec,
                 lower = minValVec,
                 upper = maxValVec,
                 control = list(iter.max=100000,eval.max=20000),
                 Budget = 1e4)

Если вы использовали указанный пользователем аргумент gradient you ' Я тоже должен обернуть это.

Этот вопрос CV указывает на то, что вы можете максимизировать, сводя к минимуму отрицательные значения функции, но не вставляйте go в гайки и болты.

Решение на основе optim() будет выглядеть примерно так:

optim(fn = TotalSpend,
      par = startValVec,
      lower = minValVec,
      upper = maxValVec,
      method = "L-BFGS-B",
      control = list(maxit=100000, fnscale=-1),
      Budget = 1e4)
  • L-BFGS-B - единственный метод, встроенный в optim(), который выполняет оптимизацию с ограничением по блокам
  • optim() не делает t иметь отдельные элементы управления для максимальной итерации и оценки максимальной функции
0 голосов
/ 27 апреля 2020

Вот пример с простой функцией paraboli c, она работает так же с nlminb и optim:

## ==== Some preliminaries ========================
par(mfrow=c(1,2))
a <- b <- seq(-10, 10, 0.1)

## ==== Search for a minimum ======================

# function has minimum
f1 <- function(a, b) {
  (a - 1)^2 + (b - 2)^2
}
## show function, blue color is low
image(a, b, outer(a,  b, f1), col=topo.colors(16))

## wrapper: combine parameters
g1 <- function(p) f1(p["a"], p["b"])

## minimization
(ret <- nlminb(c(a=0, b=0), g1))
## show minimum
points(t(ret$par), pch="+", cex=2)


## ==== Search for a maximum =======================

## function has a maximum
f2 <- function(a, b) {
  - (a - 1)^2 - (b + 2)^2
}
## brown color is high
image(a, b, outer(a,  b, f2), col=topo.colors(16))

## wrapper:  combine parameters, invert sign
g2 <- function(p) -f2(p["a"], p["b"])

## minimization of negative objective = maximization
(ret <- nlminb(c(a=0, b=0), g2))
## show maximum
points(t(ret$par), pch="+", cex=2)

optimization landscape

...