вычисление градиента и гессиана в R

Как известно, Градиентом функции является следующий вектор:

Градиент

а гессиан - это следующая матрица:

Гессен

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

Во-первых, я нашел пакет с именем numDeriv, который, похоже, имеет необходимые функции. grad и hessian, но теперь я не могу получить правильные результаты... Итак, вот мой рабочий процесс:

Допустим, нам дана функция f(x,y) = x^2 * x^3, и нам нужно вычислить градиент и гессиан в точке (x=1, y=2).

Как уже было сказано, я определяю эту функцию в R:

dummy <- function(x,y) {
  rez <- (z^2)*(y^3)
  rez
}

а затем используйте grad следующее способ:

grad(func=dummy, x=1, y=2)

что дает мне результат 16 - и проблема в том, что это только первое значение из вектора градиента, правильная версия которого

[16, 12]

То же самое касается hessian:

hessian(func=dummy, x=1, y=2)

что дает мою матрицу 1x1 со значением 16 вместо матрицы 2x2

     [,1] [,2]
[1,]   16   24
[2,]   24   12

Так вот вопрос, что я делаю не так?

Спасибо.


person A S    schedule 28.01.2015    source источник
comment
Кстати, я также пробовал Wolfram|Alpha но также не удалось получить правильные результаты...   -  person A S    schedule 28.01.2015
comment
Khashaa, да, теперь я понимаю свою ошибку, спасибо :).   -  person A S    schedule 28.01.2015


Ответы (2)


Вы можете использовать библиотеку pracma, например:

library(pracma)

dummy <- function(x) {
  z <- x[1]; y <- x[2]
  rez <- (z^2)*(y^3)
  rez
}

grad(dummy, c(1,2))
[1] 16 12

hessian(dummy, c(1,2))
     [,1] [,2]
[1,]   16   24
[2,]   24   12
person Community    schedule 28.01.2015
comment
@AS для дальнейшего использования загрузите пакет sos. Это упрощает поиск ключевых слов. В вашем случае вы просто наберете ???hessian, чтобы отследить эту функцию и пакет. - person Carl Witthoft; 28.01.2015

Следующий код является расширением предоставленного ответа. Он рассматривает случай, когда у вас есть значения функции, а не фактическая функция. Здесь функция имеет 1 параметр. Функция Grad вычисляет в одной точке. Если у вас есть 3 параметра, вам нужно передать их x0 с помощью c(x1,x2,x3).

#i is an index, s_carvone$val contains the values of the function
dummy <- function(i) 
{
  return (s_carvone$val[i])
}

#function that calculates the gradient in a specific point i
calc_grad <- function(i)
{
  return (pracma::grad(dummy, x0=i, heps=1))
}

#calculates the derivative from point 2 to 61
first_derivative = unlist(purrr::map(calc_grad, .x = c(2:61)));

plot(first_derivative);
person Anton Andreev    schedule 07.07.2017