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

news/2024/11/28 5:39:27/

一、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月出版,机工社)


http://www.ppmy.cn/news/1141175.html

相关文章

Spring面试题学习: 单例Bean是单例模式吗?

单例Bean是单例模式吗 学习背景答案扩展知识单例模式Spring BeanJava Bean单例Bean 个人评价我的回答 学习背景 想换工作. 学习记录, 算是一个输出. 答案 通常来说, 单例模式是指在一个JVM中, 一个类只能构造出一个对象. 有很多方法来实现单例模式, 比如饿汉模式. 但是我们通…

【DevOps】搭建你的第一个 Docker 应用栈

搭建你的第一个 Docker 应用栈 1.Docker 集群部署2.第一个 Hello World2.1 获取应用栈各节点所需镜像2.2 应用栈容器节点互联2.3 应用栈容器节点启动2.4 应用栈容器节点的配置2.4.1 Redis Master 主数据库容器节点的配置2.4.2 Redis Slave 从数据库容器节点的配置2.4.3 Redis 数…

Docker安装——Ubuntu (Jammy 22.04)

一、为什么要用 Ubuntu&#xff1f;(centos和ubuntu有什么区别&#xff09; 使用lsb_release命令&#xff1a;lsb_release -a &#xff0c;即可查看ubantu的版本&#xff0c;但是为什么要使用ubantu 呢&#xff1f; 区别&#xff1a;1、centos基于EHEL开发&#xff0c;而ubunt…

Elasticsearch:时间点 API

Elasticsearch&#xff1a;时间点 API-CSDN博客 在今天的文章中&#xff0c;我将着重介绍 Point in time API。在接下来的文章中&#xff0c;我将介绍如何运用 PIT 来对搜索结果进行分页。这也是被推荐使用的方法。 Point in time API 默认情况下&#xff0c;搜索请求针对目标…

[JAVAee]Spring拦截器

适用场景 像是页面的登录验证处理,权限校验,登录日志的处理. 实现步骤 创建⾃定义拦截器,实现 HandlerInterceptor 接⼝的 preHandle&#xff08;执⾏具体⽅法之前的预处理⽅法.将⾃定义拦截器加⼊ WebMvcConfigurer 的 addInterceptors ⽅法中. 下面以登录验证为例,实现拦…

【力扣-每日一题】2034. 股票价格波动

class StockPrice { private:unordered_map<int,int> mp; //存储日期及其对应的价格multiset<int> st; //存储所有价格int last_day; //最新一天 public:StockPrice() {this->last_day0;}void update(int timestamp, int price) {if(mp.find(timestamp)!mp…

Python数据攻略-Mongodb数仓无法写入方法汇总

Mongodb作为一个非结构化的NoSQL数据库,能存储各种复杂和多变的数据格式,如JSON。这使得Mongodb在实时数据分析和高性能查询中具有优势。 在使用Mongodb的过程中,可能会遇到写入失败的问题。常见的几种情况包括无法建立连接、认证失败和存储限制。 文章目录 诊断问题日志分…

【JavaEE重点知识归纳】第7节:类和对象

目录 一&#xff1a;了解面向对象 1.什么是面向对象 2.面向对象和面向过程区分 二&#xff1a;类定义和使用 1.什么是类 2.练习&#xff1a;定义一个学生类 三&#xff1a;类的实例化 1.什么是实例化 2.类和对象的说明 四&#xff1a;认识this 1.为什么要有this引用…