2011-03-25 5 views
12

Я пытаюсь использовать http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html в R для оптимизации в R с некоторыми заданными линейными ограничениями, но не в состоянии выяснить, как настроить проблему.Ограниченная оптимизация в R

Например, мне нужно максимизировать $ f (x, y) = log (x) + \ frac {x^2} {y^2} $ при ограничениях $ g_1 (x, y) = x + y < 1 $, $ g_2 (x, y) = x> 0 $ и $ g_3 (x, y) = y> 0 $. Как это сделать в R? Это всего лишь гипотетический пример. Не беспокойтесь о его структуре, вместо этого мне интересно узнать, как установить это в R.

спасибо!

+1

@G и другие - может кто-нибудь объяснить, почему перекрестная реклама нахмурилась? Было бы приемлемо упомянуть, что вы перекрестно размещаете ссылку? У меня нет сильных чувств так или иначе, но определенная ясность в этом вопросе, вероятно, оправдана. Если это то, с чем ранее сталкивалось R-сообщество в целом, я думаю, что связывание с этими дискуссиями было бы хорошим началом. – Chase

+0

Если вы выполните поиск на вкладке «Мета» для «перекрестной публикации», вы найдете множество мнений, большинство из которых относительно соглашается на перекрестную рассылку. (Одновременная перекрестная регистрация, однако, кажется, раздражает большинство людей.) В группах r-help и кузена существует сильная антипроцентная этика, которая изложена в Руководстве по проводке R-Help. Мне тяжело видеть, что руководство по проводке является доказательством в SO. –

+0

@Chase Когда люди пересекают почту и не позволяют никому знать, что тогда для кого-то очень возможно написать решение проблемы, которая уже решена, что может быть пустой тратой времени. Мне лично все равно, если люди перейдут посты до тех пор, пока они узнают об этом (и это не слишком). – Dason

ответ

16

Настройка функции тривиальная:

fr <- function(x) {  x1 <- x[1] 
    x2 <- x[2] 
    -(log(x1) + x1^2/x2^2) # need negative since constrOptim is a minimization routine 
} 

Настройка матрицы ограничение было проблематично из-за отсутствия большого количества документации, и я прибегла к экспериментам. На странице справки «Возможная область определяется ui% *% theta-ci> = 0». Таким образом, я проверил, и это, казалось, «работать»:

> rbind(c(-1,-1),c(1,0), c(0,1)) %*% c(0.99,0.001) -c(-1,0, 0) 
     [,1] 
[1,] 0.009 
[2,] 0.990 
[3,] 0.001 

Так я ставлю в один ряд для каждого ограничения/границы:

constrOptim(c(0.99,0.001), fr, NULL, ui=rbind(c(-1,-1), # the -x-y > -1 
               c(1,0), # the x > 0 
               c(0,1)), # the y > 0 
              ci=c(-1,0, 0)) # the thresholds 

Для этой проблемы существует потенциальная трудность в том, что для всех значений от x функция переходит в Inf при y -> 0. Я получаю max вокруг x = .95 и y = 0, даже когда я выталкиваю стартовые значения в «угол», но я несколько подозрительно, что это не тот истинный максимум, который я бы предположил, был в «углу». EDIT: Занимаясь этим, я рассудил, что градиент может обеспечить дополнительное «направление» и добавил функцию градиента:

grr <- function(x) { ## Gradient of 'fr' 
    x1 <- x[1] 
    x2 <- x[2] 
    c(-(1/x[1] + 2 * x[1]/x[2]^2), 
     2 * x[1]^2 /x[2]^3) 
} 

Это было «рулить» оптимизации немного ближе к с (.999 ... 0) вместо того, чтобы отойти от него, как это было сделано для некоторых начальных значений. Я по-прежнему немного разочарован тем, что процесс, кажется, «голова на скале», когда исходные значения близки к центру допустимой области:

constrOptim(c(0.99,0.001), fr, grr, ui=rbind(c(-1,-1), # the -x-y > -1 
               c(1,0), # the x > 0 
               c(0,1)), # the y > 0 
              ci=c(-1,0, 0)) 
$par 
[1] 9.900007e-01 -3.542673e-16 

$value 
[1] -7.80924e+30 

$counts 
function gradient 
    2001  37 

$convergence 
[1] 11 

$message 
[1] "Objective function increased at outer iteration 2" 

$outer.iterations 
[1] 2 

$barrier.value 
[1] NaN 

Примечание: Ханс Вернер Borchers опубликовал лучший пример на R-Help, что удалось получить угловые значения, установив ограничение немного в сторону от края:

> constrOptim(c(0.25,0.25), fr, NULL, 
       ui=rbind(c(-1,-1), c(1,0), c(0,1)), 
       ci=c(-1, 0.0001, 0.0001)) 
$par 
[1] 0.9999 0.0001 
+0

Это очень полезно. Пример, который я опубликовал, не был идеальным, но я вижу, как настроить функцию. Что такое приемлемый регион? – user236215

+0

Возможная область - это множество точек, удовлетворяющих всем ограничениям. Треугольник в вашей спецификации. –

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