如何最小化R中一个输入参数的函数

Enz*_*nzo 9 r minimize

假设我有一个定义如下的函数

myFunction = function(input1, input2, input3) {
    # do something with input and then return
}
Run Code Online (Sandbox Code Playgroud)

现在我想最小化myFunction第一个输入,即input1修复其他参数.

在R,似乎有像一些预装的功能nlm,optim等等.但是文件并没有真正解释如何做到上述的问题.例如,似乎optim只能在1个输入上最小化一个函数?我可能错了,但请纠正我,并告诉我这种最小化问题的建议方法.

非常感谢你!

Dav*_*son 9

为了在输入为矢量时最小化输出,您可以使用optim.

myFunction = function(input1, input2, input3) sum(abs(input1 - 3))
o = optim(7:10, myFunction, input2=5, input3=6)
o$par
# [1] 2.999989 2.999995 3.000000 3.000001
Run Code Online (Sandbox Code Playgroud)

optim(7:10在我的例子中)的第一个参数是input1(猜测从哪里开始优化)的起始值.第二个是函数,然后你可以传入固定的参数(比如input2input3).

在这个例子中,最小值只是3s的向量(因为它最小化sum(abs(input1 - 3))).


如果您只执行一维最小化,则可以使用该optimize函数,并在传递函数后将其他输入传递给它:

myFunction = function(input1, input2, input3) {
    return(abs(input1 - 3) + input2 + input3)
}

o = optimize(myFunction, 2, 3, interval=c(-100, 100))
print(o$minimum)
# [1] 3.000003
Run Code Online (Sandbox Code Playgroud)

如果你想基于input2input3(一个不是函数的第一个参数)最小化,你可以将其他参数作为命名参数:

myFunction = function(input1, input2, input3) {
    return(abs(input1 - 3) + abs(input2 - 12) + input3)
}

print(optimize(myFunction, input1=2, input3=3, interval=c(-100, 100)))
print(o$minimum)
[1] 11.99998
Run Code Online (Sandbox Code Playgroud)

如果你想知道为什么这是可能的,那是因为它optimize被定义为:

function (f, interval, ..., lower = min(interval), upper = max(interval), 
          maximum = FALSE, tol = .Machine$double.eps^0.25) 
Run Code Online (Sandbox Code Playgroud)

...允许使用随后传递给它的任何数量的附加参数myFunction.

  • 不需要这个额外的功能(currying); 你可以简单地通过`...`传递额外的参数:`o = optimize(myFunction,2,3,interval = c(-100,100))` (3认同)