• R函数optim()最小化或者最大化多参数函数


    一、optimize()最小化或者最大化单参数函数

    1.1函数介绍

    函数功能描述:给定一个单参数函数f,需要找到使得f达到其最小值或者最大值的点。

    使用optimize()函数最小化单参数函数时,需要指定最小化的函数f及其定义域(x的上界和下界):

    optimize(f, lower = lowerBound, upper = upperBound)

    如果需要最大化函数,需要指定参数maximum=TRUE,即

    optimize(f, lower = lowerBound, upper = upperBound, maximum = TRUE)

    1.2示例

    optimize()函数可以对单参数函数求最大值或者最小值。它需要在参数中指明需要求极值的函数的自变量x的取值范围。

    以下示例查找多项式函数:3x^{4}-2x^{3}+3x^{2}-4x+5的最小值:

    1. f <- function(x){
    2. x*x^4- 2*x^3+ 3*x^2-4*x+5
    3. }
    4. optimize(f, lower=-20, upper=20)
    5. #或者
    6. #optimize(f, c(-20, 20)) #被优化的范围是-20,20
    7. #$minimum
    8. #[1] -19.99995
    9. #
    10. #$objective
    11. #[1] -3182675

     optimize()函数返回的值是一个包含两个元素的列表:其中minimum表示使得f达到最小值时的x,objective表示函数在该点x所达到的最小值。

    如果参数lower和upper的距离较小,它意味着搜索的区域较小,最优化的速度将较快。如果你不确定适当的搜索范围,请使用较大但合理的范围,例如lower=-1000, upper=1000。

    注意,函数在该范围内不要有多个最小值或者最大值!optimize函数将只找到并返回一个最小值或者最大值。

    二、optim()最小化或者最大化多参数函数

    2.1函数介绍

    给定多参数函数f,需要找到使函数f达到其最小值或者最大值

    • 要最小化多参数函数,使用optim,这里必须指定起始点,它时函数f的初始参数向量。

    optim(startingPoint, f)

    • 要最大化多参数函数,需要指定参数control;或者在被优化函数前加负号
    optim(startingPoint, f, control=list(fnscale = -1))

    函数optim比optimize更通用,因为optim函数可以处理多参数函数。optim函数会将函数f自变量的取值放在一个向量中,然后估计函数在该向量上的取值。函数的取值是一个纯量值(一个数值)。optim函数将从设定的起点开始,在自变量的定义域内搜索函数的最小值。

    optim()函数还提供了method参数,来选择优化函数的的算法,默认使用内尔德-米德算法作为最优化算法,其他可用的算法还有准牛顿算法、共轭梯度法和模拟退火法等方法,它们都是针对多维情形设计的最优化算法。

    2.2示例

    示例1:

    极小化目标函数:100*(x_{2}-x_{1}^{2})^{2}+(1-x_1)^2,其中x_1x_2是未知变量。

    1. fr <- function(x) { ## Rosenbrock Banana function
    2. x1 <- x[1]
    3. x2 <- x[2]
    4. 100 * (x2 - x1 * x1)^2 + (1 - x1)^2
    5. }
    6. optim(c(-1.2,1), fr)
    7. #$par
    8. #[1] 1.000260 1.000506
    9. #
    10. #$value
    11. #[1] 8.825241e-08
    12. #
    13. #$counts
    14. #function gradient
    15. # 195 NA
    16. #
    17. #$convergence
    18. #[1] 0
    19. #
    20. #$message
    21. #NULL

    上述代码调用optim函数,从(-1.2, 1)开始搜索f的最小值。

    返回的列表包括一个分量convergence,它的值显示optim函数是否找到了f的最小值,如果该分量的值为0,那么optim找到了最小值;否则,表明optim函数没有找到最小值。显然,convergence的值是重要的返回值,因为如果算法没有收敛,其他返回值是没有意义的。

    返回的列表还包括分量par,它是最小化函数的参数;分量value,是在par处的函数值f(par)。

    在上述这个例子中,optim函数是收敛的,并且在大约x_1=1.000260x_2=1.000506处找到了最小值。

    示例2:

    给出一个使用optim来拟合非线性模型的示例。

    要极小化的目标函数:\sum_{i}^{n}|z_{i}-(x_{i}-a)^{b}|,其中a和b是未知参数。换句话说,我们要极小化的目标函数中具备两个参数,这两个参数构成了一个参数向量,这个参数向量的第一个元素是a,第二个元素是b。

    1. #load(file ="./data/opt.rdata") #load x, y, z
    2. f <- function(v) {
    3. a <- v[1]
    4. b <- v[2]
    5. sum(abs(z-((x+a)^b)))
    6. }
    7. optim(c(1,1), f)

    三、optim函数和optimize函数的区别

    • 对于函数optim而言,这个函数不用指定参数指明搜索的下界和上界,仅仅需要提供一个搜索的起点。对起点的一个好的猜测,意味着最优化算法的加快。换句话说,optim优化函数,需要有一个好的未知参数的初始值。初始值即为搜索的起点。其次,optim函数是用来优化目标函数中具有多个未知参数的函数。
    • 对于optimize函数,这个函数需要指定搜索的上界和下界,此外,这个函数只能优化一个未知参数的函数。

    参考:

    《R语言经典实例(原书第2版)》(2020年5月出版,机工社)

  • 相关阅读:
    Prometheus构建及Grafana操作展示
    设计模式之建造者模式
    LeetCode每日一题:2731. 移动机器人(2023.10.11 C++)
    java毕业设计课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw
    【SwiftUI模块】0003、SwiftUI搭建瀑布流-交错网格
    ES6中的Promise基础讲解
    Centos - CA 证书服务
    「津津乐道播客」#389 科技乱炖:技术播客月,我们一起聊聊技术与开源
    Spring boot接收zip包并获取其中excel文件的方法
    虚拟机无法启动提示give root password for maintenance的多种解决方法
  • 原文地址:https://blog.csdn.net/u011375991/article/details/133579490