calculating the Gradient and the Hessian in R

烈酒焚心 提交于 2019-12-21 02:50:06

问题


As you know, the Gradient of a function is the following vector:

and the Hessian is the following matrix:

Now, I wonder, is there any way to calculate these in R for a user defined function at a given point?

First, I've found a package named numDeriv, which seems to have the necessary functions grad and hessian but now I can't get the correct results... Thus, here's my workflow:

Let's say that we are given the function f(x,y) = x^2 * x^3, and we need to calculate the Gradient and the Hessian at the point (x=1, y=2).

That's been said, I define this function within R:

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

and then use grad the following way:

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

which gives me result 16 -- and the problem is that this only the first value from a gradient vector, the correct version of which is

[16, 12]

Same goes with the hessian:

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

which gives my 1x1 matrix with the value 16 instead of the 2x2 matrix

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

So, the question is what am I doing wrong?

Thank you.


回答1:


You can use the pracma library, such as:

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



回答2:


The following code is an extension of the answer provided. It treats the case where you have the values of the function and not the actual function. Here the function has 1 parameter. The Grad function calculates in a single point. If you have 3 parameters then you need to provide them to x0 with 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);


来源:https://stackoverflow.com/questions/28189900/calculating-the-gradient-and-the-hessian-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!