2015-01-28 12 views
2

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

the Gradient

и Гесс является следующей матрицей:

the Hessian

Теперь, интересно, есть ли способ вычислить их в 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 вместо матрицы 2х2

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

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

спасибо.

+0

На стороне записки, я также [попытался] (http://reference.wolfram.com/language/tutorial/Differentiation.html) ** Wolfram | Альфа **, но также не удалось получить правильные результаты ... –

+1

'dummy <- function (x) {(x [1]^2) * (x [2]^3)}; grad (func = dummy, x = c (1,2)); hessian (func = dummy, x = c (1,2)) ' – Khashaa

+0

Хаша, да, теперь я понимаю свою ошибку, спасибо :). –

ответ

12

Вы можете использовать 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 
+0

Паскаль, черт побери, огромное спасибо! :) –

+4

@AS для справок в будущем, загрузите пакет 'sos'. Это позволяет легко искать ключевые термины. В вашем случае вы просто наберете '??? hessian', чтобы отследить эту функцию и пакет. –

0

Следующий код является продолжением ответа при условии. Он рассматривает случай, когда у вас есть значения функции, а не фактическая функция. Здесь функция имеет 1 параметр. Функция Града вычисляется в одной точке. Если у вас есть 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); 
Смежные вопросы