gpt4 book ai didi

R 黑森矩阵

转载 作者:行者123 更新时间:2023-12-01 10:51:02 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com