首页 > 解决方案 > 是否有用于查找矢量化方程的梯度和 Hessian 的 R 函数或包?

问题描述

例如,如果我想找到关于 x 的梯度和 Hessian:

f = function(x,y,alpha,A,b){
  return((1/n)*(y-alpha*x)%*%(y-alpha*x) + (A%*%x-b)%*%(A%*%x-b))
}

标签: rvectorizationgradienthessian

解决方案


CRAN 包Deriv可以计算 R 函数的符号导数。
在下面的代码中,我删除了return对张贴函数的调用f
函数DDeriv是来自此 RPubs 帖子的复制和粘贴,更改为使用而不是不接受函数作为其第一个参数Deriv的 base 。D

library(Deriv)

DDeriv <- function(expr, name, order = 1){
  if(order < 1) stop("Order must be >= 1")
  if(order == 1) Deriv(expr, name)
  else DDeriv(Deriv(expr, name), name, order - 1)
}


f <- function(x,y,alpha,A,b){
  (1/n)*(y-alpha*x)%*%(y-alpha*x) + (A%*%x-b)%*%(A%*%x-b)
}

直接使用函数Deriv

Deriv(f, "x")
#function (x, y, alpha, A, b) 
#{
#    .e1 <- -alpha
#    .e3 <- A %*% x - b
#    .e5 <- y - alpha * x
#    (.e1 %*% .e5 + .e5 %*% .e1)/n + .e3 %*% A + A %*% .e3
#}

使用功能DDeriv

DDeriv(f, "x", 1)
#function (x, y, alpha, A, b) 
#{
#    .e1 <- -alpha
#    .e3 <- A %*% x - b
#    .e5 <- y - alpha * x
#    (.e1 %*% .e5 + .e5 %*% .e1)/n + .e3 %*% A + A %*% .e3
#}

DDeriv(f, "x", 2)
#function (x, y, alpha, A, b) 
#{
#    .e1 <- -alpha
#    2 * (.e1 %*% .e1/n) + 2 * A %*% A
#}

推荐阅读