我正在尝试创建一个函数来表示理论上的海森矩阵,然后可以在不同的位置计算它。首先,我尝试将表达式设置为矩阵或数组中的值,但是尽管我可以将表达式初始化为矩阵,但无法用计算出的值替换。
hessian_matrix <- function(gx, respect_to){
out_mat <- matrix(0, nrow=length(respect_to), ncol=length(respect_to))
for(i in 1:length(respect_to)){
for(j in 1:length(respect_to)){
dthetad2x <- deriv(D(gx, respect_to[i]), respect_to[j], function.arg=TRUE)
# also tried
# dthetad2x <- as.expression(D(D(gx, respect_to[i])))
out_mat[i,j] <- dthetad2x
}
return(out_mat)
}
因为这样做不起作用,我决定创建一个环境来存放作为对象的hessian矩阵的索引。
hessian_matrix <- function(gx, respect_to){
out_env <- new.env()
for(i in 1:length(respect_to)){
for(j in 1:length(respect_to)){
dthetad2x <- as.call(D(D(gx, respect_to[i]), respect_to[j]))
assign(paste0(i,j), dthetad2x, out_env)
}
}
return(out_env)
}
g <- expression(x^3-2*x*y-y^6)
h_g <- hessian_matrix(g, respect_to = c('x', 'y'))
这是有效的,当我把它作为一个参数传递进来求值时,我可以看到表达式,但我不能求值。我尝试了call()、eval()、do.call()、get()等,但它不起作用。我还在传递的环境中赋值答案,创建一个新的环境来返回,或者简单地使用变量。
fisher_observed <- function(h, at_val, params, sum=TRUE){
out_env <- new.env()
# add params to passed environment
for(i in 1:length(at_val)){
h[[names(at_val)[i]]] <- unname(at_val[i])
}
for(i in ls(h)){
value <- do.call(i, envir=h, at_val)
assign(i, value, out_env)
}
return(h)
}
fisher_observed(h_g, at_val=list(x=1,y=2))
根据do.call()的代码,应该这样使用它,但是当以这种方式作为参数传递时,它不起作用。
3条答案
按热度按时间2ul0zpep1#
R已经有了Hessian矩阵函数,你不需要写一个,你可以使用
deriv
或deriv3
,如下所示:如果您想使用函数,可以执行以下操作:
虽然这个函数不是必需的,因为如果你想要梯度和hessian,你会做双重计算
rta7y2nd2#
我 * 认为 * 这(几乎)做到了你想要的:
当前返回已计算点的命名列表:
您仍然需要将其重新排列成一个矩阵(如果保留列名,应该相当容易。我认为关键是在
h_g
中查找值时名称必须是字符。rm5edbpk3#
你不能有一个“调用”矩阵,但你可以有一个字符矩阵,然后计算它: