使用R来优化函数的参数

时间:2018-02-22 16:57:19

标签: r optimization

我熟悉R中的优化函数。我尝试了三种不同的方法:

library(optimx)
library(optimr)

f = function(par){20*par[1] - 3*par[1]^2 + par[1] * par[2]}

# First try wiht optim()

result1 = optim(par = c(0,0), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B", control = list(fnscale = -1))
coef(result1) # Null

# Second try with optimr

result2 = optimr(par = c(0,0), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B", control = list(maximize = TRUE))
coef(result2) # Null

# Third try with optimx

result3 = optimx(par = c(0,0), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B", control = list(maximize = TRUE))
coef(result3)

p1 : 3.666667
p2  : 2

为什么optim()和optimr()在optimx()成功的地方失败?

您的建议将不胜感激。

3 个答案:

答案 0 :(得分:0)

首先,你的f采用两个参数而不是长度为2的向量(你需要后者)。第二,它不是coef给出结果的东西;我怀疑你想要result$par。因此,

library(optimr)
f <- function(x) -(20 * x[1] - 3 * x[1]^2 + x[2] / 2)

result <- optimr(par = c(1, 1), fn = f, upper = c(5, 2), lower = c(0, 0), 
                 method = "L-BFGS-B")
result$par
# [1] 3.333333 2.000000

我向f添加减号以最小化函数,optimr无法以某种方式无法最大化它。

答案 1 :(得分:0)

这是一个具有基本optim功能的解决方案,可实现最大化。您遇到的问题是它应该是一个包含您想要解决的所有参数的向量2,而不是独立的参数。我尝试使用optimr,但出于某种原因,它最大化了。

f = function(x){-1*(20*x[1] - 3*x[1]^2 + x[2]/2)}
result = optim(par = c(1,1), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B")

答案 2 :(得分:0)

不需要{optimr}包,基本R就可以了:

optim(
    c(1, 1),
    function (x) -f(x[1], x[2]),
    method = 'L-BFGS-B'
)
$par
[1] 3.325034e+00 1.682724e+13

$value
[1] -8.413622e+12

$counts
function gradient
      40       40

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

请注意,我们需要调整函数的参数arity(optim使用单个参数向量),并且,由于我们想要最大化,我们反转目标函数的符号。因此,我们将function (x) -f(x[1], x[2])作为fn传递,而不仅仅是f