R 黑森矩阵

标签 r matrix expression derivative hessian-matrix

Hessian matrix

我需要创建一个函数的 Hessian 矩阵:

func <- expression(sin(x+y)+cos(x-y))
vars <- c("x", "y")

我也需要二阶导数作为表达式,我需要对它们求很多次,所以我制作了一个一阶导数列表和一个二阶导数列表列表。

funcD <- lapply(vars, function(v) D(func, v))
funcDD <- list(); for (i in 1:length(vars)) funcDD[[i]] <- lapply(vars, function(v) D(funcD[[i]], v))

到目前为止,它有效。

> funcDD
[[1]]
[[1]][[1]]
-(sin(x + y) + cos(x - y))

[[1]][[2]]
-(sin(x + y) - cos(x - y))


[[2]]
[[2]][[1]]
cos(x - y) - sin(x + y)

[[2]][[2]]
-(cos(x - y) + sin(x + y))

现在问题: 如何创建包含已评估表达式值的矩阵? 在外面试过,没用。

> h <- outer(c(1:length(vars)), c(1:length(vars)), function(r, c) eval(funcDD[[r]][[c]], envir = list(x = 1, y = 2)))
Error in funcDD[[r]] : subscript out of bounds

其他问题: 有没有更优雅的方法来存储二阶导数表达式?例如,是否可以将表达式存储在矩阵中而不是列表的列表中?

第三个问题: 是否有可能获得表达式变量的向量?上面我使用了我手动输入的 vars <- c("x", "y") ,是否有必要或是否有类似“get_variables”的方法?

最佳答案

第二个问题的答案是“大部分是”,它几乎可以立即回答您的问题:

funcD <- sapply(vars, function(v) D(func, v))
funcDD <- matrix(list(), 2,2)
for (i in 1:length(vars)) 
        funcDD[,i] <- sapply(vars, function(v) D(funcD[[i]], v))
funcDD
#---------
     [,1]       [,2]      
[1,] Expression Expression
[2,] Expression Expression
> funcDD[1,1]
[[1]]
-(sin(x + y) + cos(x - y))

“大部分”限定条件是需要使用“列表”而不是“表达式”作为矩阵保存的对象类型。表达式并不真正符合原子对象的条件,您可以轻松提取值并将其用作调用,这甚至可能比将其作为表达式更方便:

> is.expression(funcDD[1,1])
[1] FALSE
> funcDD[1,1][[1]]
-(sin(x + y) + cos(x - y))
> class(funcDD[1,1][[1]])
[1] "call"

原来想要的是相同的结构,所以这会调用每个矩阵元素,并使用与评估环境相同的特定向量,并将它们全部作为矩阵返回。:

matrix(sapply(funcDD, eval, env=list(x=0, y=pi)), length(vars))
#---------
     [,1] [,2]
[1,]    1   -1
[2,]   -1    1

关于R 黑森矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20297711/

相关文章:

c - 在不使用 C 中的第三个变量的情况下交换两个变量的值?

Java Play Ebean - 如何使用表达式 Expr.Or() 或类似的

r - 使用 "1"链接两个数据帧并提取相应的值

r - ggplot2 中较小中断的较短刻度线

r - 从函数内打印到 R 控制台

opengl - 为什么投影矩阵必须是双倍的?

r - 从向量 R 中提取带小数的数字

delphi - 如何在 FireMonkey 中将图像绘制到旋转的矩形上?

c - C 中的矩阵乘法 - 结果矩阵中的错误值

c# - 从范围 'x.Sub' 引用类型为 'SubType' 的变量 '' 但未定义错误