计算 R 中的梯度和 Hessian
calculating the Gradient and the Hessian in R
如您所知,函数的梯度是以下向量:
而 Hessian 是以下矩阵:
现在,我想知道,有没有什么方法可以在 R 中为给定点的用户定义函数计算这些值?
首先,我找到了一个名为numDeriv
的包,它似乎具有必要的功能grad
和hessian
,但现在我无法得到正确的结果.. . 因此,这是我的工作流程:
假设给定函数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);
如您所知,函数的梯度是以下向量:
而 Hessian 是以下矩阵:
现在,我想知道,有没有什么方法可以在 R 中为给定点的用户定义函数计算这些值?
首先,我找到了一个名为numDeriv
的包,它似乎具有必要的功能grad
和hessian
,但现在我无法得到正确的结果.. . 因此,这是我的工作流程:
假设给定函数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);