2015-03-17 5 views
2

Я хотел бы использовать optimize() или что-то подобное, чтобы найти минимальное/максимальное значение функции. Однако я не уверен в точном диапазоне, по которому функция должна быть оптимизирована, что является обязательным параметром для функции «optimze()» (например, optimize(f=FUN,interval=c(lowerBound,upperBound))).R: одномерная оптимизация

В этой проблеме оптимизации я могу оценить значение a, которое «близко» к оптимальному решению, но «близость» зависит от ситуации.

Есть ли функция в R, которая может использовать начальное значение a, которое не требует, чтобы интервал, над которым функция оптимизирована, должна быть указана спереди?

+0

Как насчет 'my_optimize = function (f, a) {optimize (f = f, interval = c (a - 100, a + 100))}' – Gregor

ответ

5

Когда вы говорите, что не уверены в нижнем пределе, я подозреваю, что это означает, что параметр, который вы пытаетесь оценить, не ограничен ниже.

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

Эта тривиальная функция имеет минимум при х = 4:

fun <- function(x) -exp(-(x - 4)^2) + 8 

который можно найти с помощью:

optimize(f=fun,interval=c(0,8)) 
#> $minimum 
#> [1] 4 

, но давайте представим на минуту, что мы не уверены, если есть нижний предел или нет, и что мы знаем, что верхний предел равен 8. R, если мы попробуем:

optimize(f=fun,interval=c(-Inf,8)) 

т.к. границы должны быть конечными. В этом случае мы можем использовать экспоненциальное преобразование (exp()), которая отображает действительные числа с положительными числами, например, так:

optimize(f=function(x)fun(log(x)), 
     interval=exp(c(-Inf,8))) 
#> $minimum 
#> [1] 54.59815 

, а затем, чтобы получить корень, нужно просто поддержать преобразование над решение с помощью:

log(54.59815) 
#> 4 

Если вы не знаете, как верхняя или нижняя граница основного параметра, то вы можете использовать преобразование рубленые шансов вместо log():

function(x) log(x/(1-x)) 

и это обратное вместо exp():

function(y) exp(y)/(1 + exp(y)) 

Заметим, что преобразование лог-коэффициенты отображает действительные числа на единичный интервал, поэтому интервал параметра становится 0:1.

Эти решения имеют некоторые числовые ограничения (например, если бы мы установили interval=exp(c(-Inf,16)) в первом решении, мы получили бы ошибку). Подсказка, вы можете изменить масштаб этих преобразований в центр вокруг заданной точки a, что может уменьшить числовые ограничения.

+0

Хорошая информация. Эти операции преобразования/нетрансформации также влияют на указанный допуск ('tol ='), который определяет точность оптимизации. Возможно, придется приспособиться к этому. – thelatemail

+0

Да, абсолютно. Это одна из тех «ограничений», которые я замалчивал. – Jthorpe

+0

Один трюк заключается в использовании схемы преобразования/обратного преобразования, чтобы получить достаточно близкое предположение, а затем переоценить без преобразования с интервалом, который в несколько раз превышает время допуска более чем на первую производную преобразования при оцененных максимумах/минимумах , – Jthorpe

Смежные вопросы