计算 R 中的梯度和 Hessian

calculating the Gradient and the Hessian in R

如您所知,函数的梯度是以下向量:

而 Hessian 是以下矩阵:

现在,我想知道,有没有什么方法可以在 R 中为给定点的用户定义函数计算这些值?

首先,我找到了一个名为numDeriv的包,它似乎具有必要的功能gradhessian,但现在我无法得到正确的结果.. . 因此,这是我的工作流程:

假设给定函数f(x,y) = x^2 * x^3,我们需要计算点(x=1, y=2)处的Gradient和Hessian .

说了这么多,我在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

所以,问题是我做错了什么?

谢谢。

可以使用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

以下代码是对所提供答案的扩展。它处理您拥有函数值而不是实际函数的情况。这里的函数有 1 个参数。 Grad 函数以单点计算。如果你有 3 个参数,那么你需要使用 c(x1,x2,x3) 将它们提供给 x0。

#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);