【问题标题】:How to minimize a function over one input parameter in R如何在R中的一个输入参数上最小化函数
【发布时间】:2013-06-05 12:03:49
【问题描述】:

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

myFunction = function(input1, input2, input3) {
    # do something with input and then return
}

现在我想在第一个输入(即input1)上最小化myFunction,同时修复其他参数。

在 R 中,似乎有一些预打包的函数,如 nlmoptim 等。但文档并没有真正解释如何解决上述问题。例如,optim 似乎只能通过 1 个输入最小化一个函数?我可能错了,但请纠正我,并告诉我做这种最小化问题的建议方法。

非常感谢!

【问题讨论】:

    标签: r minimize


    【解决方案1】:

    若要在输入为向量时最小化输出,您可以使用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
    

    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
    

    如果您想根据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
    

    如果您想知道为什么会这样,那是因为 optimize 被定义为:

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

    ... 允许使用任意数量的附加参数,然后将其传递给 myFunction

    【讨论】:

    • 不需要这个额外的功能(currying);你可以简单地通过...传递额外的参数:o = optimize(myFunction, 2, 3, interval=c(-100, 100))
    • 很抱歉,我忘记提到的一件事是,如果我的第一个参数是向量,我该怎么办?似乎optimize() 期望所有参数都是实数。
    • @Enzo:要清楚,然后您想要优化整个向量,例如找到最小化输出的那个长度的向量(此时它不再是一维优化)?或者您想为该向量中的每个值运行一次优化?
    • @DavidRobinson 是的,这不是一维优化问题。我想最小化整个向量的函数,就像最小化学习算法的成本函数一样。
    • @Enzo:查看我的答案的更新 - 我相信顶部的部分(使用 optim)是您想要的。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2016-07-22
    • 2020-12-27
    • 1970-01-01
    • 2020-11-07
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多