我想找到函数的最大值:
Fd <- 224 * d1 + 84 * d2 + d1 * d2 - 2 * d1^2 - d2^2
我可以使用&#39;详尽无遗的&#39;使用以下代码进行搜索:
my.data <- expand.grid(x1 = seq(0, 200, 1), x2 = seq(0, 200, 1))
d1 <- my.data[,1]
d2 <- my.data[,2]
Fd <- 224 * d1 + 84 * d2 + d1 * d2 - 2 * d1^2 - d2^2
new.data <- data.frame(Fd = Fd, d1 = d1, d2 = d2)
# identify values of d1 and d2 that maximize Fd
new.data[new.data$Fd == max(new.data$Fd),]
# Fd d1 d2
# 16157 11872 76 80
在11872
和d1 = 76
时,该函数的最大值为d2 = 80
。
我还可以使用optim
找到最大值,并使用以下代码:
Fd <- function(betas) {
b1 = betas[1]
b2 = betas[2]
-1 * (224 * b1 + 84 * b2 + b1 * b2 - 2 * b1^2 - b2^2)
}
optim(c(1,1), Fd, hessian = TRUE)
我将上面的函数乘以-1
以获得最大值,并注意到此代码返回的最大值是真实最大值的负值。此外,此代码返回的Hessian是真正的Hessian * -1:
true.hessian <- matrix(c(-4, 1, 1, -2), nrow = 2, byrow = TRUE)
true.hessian
estimated.hessian <- -1 * true.hessian
estimated.hessian
直到现在我才意识到这一点,并且在optim
页面上没有看到它。我应该担心吗?如果是这样,在什么情况下?
optim
语句中是否有一个选项可以返回原始函数的真Hessian而不是-1 *找到最大值时的原始函数?或者我应该知道当我搜索最大值(而不是搜索最小值)并且自己更正Hessian时,Hessian乘以-1?
答案 0 :(得分:1)
这将在最大化函数时返回正确的Hessian:
Fd <- function(betas) {
b1 = betas[1]
b2 = betas[2]
(224 * b1 + 84 * b2 + b1 * b2 - 2 * b1^2 - b2^2)
}
optim(c(1,1), Fd, control=list(fnscale=-1), hessian = TRUE)
# $par
# [1] 76.00046 79.99999
#
# $value
# [1] 11872
#
# $counts
# function gradient
# 129 NA
#
# $convergence
# [1] 0
#
# $message
# NULL
#
# $hessian
# [,1] [,2]
# [1,] -3.999998 0.999999
# [2,] 0.999999 -2.000000