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

2023-10-06 00:04

本文主要是介绍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的最小值:

f <- function(x){x*x^4- 2*x^3+ 3*x^2-4*x+5
}optimize(f, lower=-20, upper=20)
#或者
#optimize(f, c(-20, 20)) #被优化的范围是-20,20#$minimum
#[1] -19.99995
#
#$objective
#[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是未知变量。

fr <- function(x) {   ## Rosenbrock Banana functionx1 <- x[1]x2 <- x[2]100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
optim(c(-1.2,1), fr)#$par
#[1] 1.000260 1.000506
#
#$value
#[1] 8.825241e-08
#
#$counts
#function gradient 
#     195       NA 
#
#$convergence
#[1] 0
#
#$message
#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。

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

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

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

参考:

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

这篇关于R函数optim()最小化或者最大化多参数函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152346

相关文章

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C