2014-02-21 2 views
5

В R, можно ли аналитически найти шаблон якобиана/гессиана/разреженности, когда вы предоставляете только целевую функцию и ограничения для проблемы оптимизации?Проблема оптимизации, нелинейная: автоматический аналитический якобиан/гессиан из объектива и ограничений в R?

AMPL делает это, и из того, что я слышу, даже MATLAB может это сделать, но я не знаю, нужен ли вам Knitro для этого.

Однако все инструменты оптимизации для R (например, nloptr), по-видимому, требуют me, чтобы ввести градиент и сам Гессиан, что очень сложно, так как я работаю со сложной моделью.

+0

В оптимизме есть параметр 'hessian'. Разве это не то, что вы хотите? – Dason

+0

Гессен вычисляется численно, что является проблемой для типа работы, которую я делаю. – robertevansanders

ответ

4

То, что вы ищете, называется automatic differentiation. К сожалению, мне кажется, что он недоступен в R.

Для его реализации было attempts 5 years ago, но мое короткое расследование показало, что эти попытки вымерли.

Существует довольно недавний пакет R (Automatic Differentiation Model Builder), но мне непонятно, как его использовать или как применить это к вашей ситуации. (Я сам не пользуюсь R, поэтому я не знаю.)

+0

Ничего себе, это невероятно разочаровывает. – robertevansanders

+1

@ robbieboy74 Да, извините ... Я тоже был разочарован. :( – Ali

+1

Я только что написал пакет AD в R: https://github.com/shabbychef/madness. Отправьте вопрос, если у вас есть. – shabbychef

1

Посмотрите на solnp, package Rsolnp. Это нелинейное программирование решатель, который не требует аналитического якобиана или Гесса:

min f(x) 
s.t. g(x) = 0 
l[h] <= h(x) <= u[h] 
l[x] <= x <= u[x] 
+0

Знаете ли вы, если он вычислит якобиан и гессиан численно? Или он способен понять проблему оптимизации так, как это может говорить математический язык программирования, и найти аналитические производные, которые он может использовать? – robertevansanders

+0

Он, конечно, использует тип конечных разностей численного приближения. Последнее (символическое дифференцирование) также [доступно] (http://stats.stackexchange.com/questions/4775/symbolic-comput-in-r) в R, кстати. – tonytonov

+0

Конечные различия - большая проблема в той работе, которую я делаю.Расчетная нагрузка довольно высока, и мне нужно предоставить аналитические производные для решателя, если она закончится в разумные сроки. Вы говорите, что я должен всегда программировать дериваты себя в R? (В отличие от MATLAB и AMPL?) – robertevansanders

2

1) по умолчанию методам Nelder Мид в optim не нужна производных и не вычислять их внутренне либо.

2)D, deriv и связанные с ними функции R (см ?deriv) можно вычислить простые символические производные.

3)Ryacas package может вычислять символические производные.

0

Я написал базовый пакет для автоматического разграничения в R, называемый madness. Хотя он в первую очередь предназначен для многомерного метода дельта, он также должен использоваться для автоматического вычисления градиентов. Пример использования:

require(madness) 

# the 'fit' is the Frobenius norm of Y - L*R 
# with a penalty for strongly negative R. 
compute_fit <- function(R,L,Y) { 
    Rmad <- madness(R) 
    Err <- Y - L %*% Rmad 
    penalty <- sum(exp(-0.1 * Rmad)) 
    fit <- norm(Err,'f') + penalty 
} 

set.seed(1234) 
R <- array(runif(5*20),dim=c(5,20)) 
L <- array(runif(1000*5),dim=c(1000,5)) 
Y <- array(runif(1000*20),dim=c(1000,20)) 
ftv <- compute_fit(R,L,Y) 
show(ftv) 
show(val(ftv)) 
show(dvdx(ftv)) 

я вернусь следующее:

class: madness 
     d (norm((numeric - (numeric %*% R)), 'f') + (sum(exp((numeric * R)), na.rm=FALSE) + numeric)) 
calc: ------------------------------------------------------------------------------------------------ 
                 d R 
    val: 207.6 ... 
dvdx: 4.214 4.293 4.493 4.422 4.672 2.899 2.222 2.565 2.854 2.718 4.499 4.055 4.161 4.473 4.069 2.467 1.918 2.008 1.874 1.942 0.2713 0.2199 0.135 0.03017 0.1877 5.442 4.81 
1 5.472 5.251 4.674 1.933 1.62 1.79 1.902 1.665 5.232 4.435 4.789 5.183 5.084 3.602 3.477 3.419 3.592 3.376 4.109 3.937 4.017 3.816 4.2 1.776 1.784 2.17 1.975 1.699 4.365 4 
.09 4.475 3.964 4.506 1.745 1.042 1.349 1.084 1.237 3.1 2.575 2.887 2.524 2.902 2.055 2.441 1.959 2.467 1.985 2.494 2.223 2.124 2.275 2.546 3.497 2.961 2.897 3.111 2.9 4.44 
2 3.752 3.939 3.694 4.326 0.9582 1.4 0.8971 0.8756 0.9019 2.399 2.084 2.005 2.154 2.491 ... 
varx: ... 

     [,1] 
[1,] 207.6 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] 
[1,] 4.214 4.293 4.493 4.422 4.672 2.899 2.222 2.565 2.854 2.718 4.499 4.055 4.161 4.473 4.069 2.467 1.918 2.008 1.874 1.942 0.2713 0.2199 0.135 0.03017 0.1877 5.442 4.811 
    [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49] [,50] [,51] [,52] [,53] [,54] 
[1,] 5.472 5.251 4.674 1.933 1.62 1.79 1.902 1.665 5.232 4.435 4.789 5.183 5.084 3.602 3.477 3.419 3.592 3.376 4.109 3.937 4.017 3.816 4.2 1.776 1.784 2.17 1.975 
    [,55] [,56] [,57] [,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] [,67] [,68] [,69] [,70] [,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79] [,80] [,81] 
[1,] 1.699 4.365 4.09 4.475 3.964 4.506 1.745 1.042 1.349 1.084 1.237 3.1 2.575 2.887 2.524 2.902 2.055 2.441 1.959 2.467 1.985 2.494 2.223 2.124 2.275 2.546 3.497 
    [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90] [,91] [,92] [,93] [,94] [,95] [,96] [,97] [,98] [,99] [,100] 
[1,] 2.961 2.897 3.111 2.9 4.442 3.752 3.939 3.694 4.326 0.9582 1.4 0.8971 0.8756 0.9019 2.399 2.084 2.005 2.154 2.491 

Заметим, что производная является производной от скаляра по отношению к матрице 5 х 20, но сведен здесь к вектору , (К сожалению, вектор строки.)